Bash argümanlarını boşluklu tek dizgeye katmak


39

Tüm argümanları bir Bash işlevine, her argümanı ayıran boşluklarla tek bir dizgede birleştirmeye çalışıyorum. Ayrıca, dizenin tüm dizenin etrafına tek tırnak içermesi gerekir.

İşte şimdiye kadar elimde olan şey ...

$array=("$@")
str="\'"
for arg in "${array[@]}"; do
    let $str=$str+$arg+" "
done
let $str=$str+"\'"

Açıkçası bu işe yaramadı ama bunu başarmanın bir yolu olup olmadığını merak ediyorum?

Yanıtlar:


53

İstediğin şeyin bu olduğuna inanıyorum. Tüm argümanları tek bir dizgeye yerleştirir, boşluklarla ayırarak, hepsine tek tırnak işareti koyar:

str="'$*'"

$*$IFSvarsayılan olarak bir boşluk olan ilk karakterle ayrılan tüm komut dosyaları argümanlarını üretir .

Çift tırnaklı bir dizgede tek tırnaktan kaçmaya gerek yoktur.

Örnek

Yukarıdakileri bir komut dosyasına koyalım:

$ cat script.sh 
#!/bin/sh
str="'$*'"
echo "$str"

Şimdi betiği örnek değişkenlerle çalıştırın:

$ sh script.sh one two three four 5
'one two three four 5'

Bu betik POSIX'dir. İşe yarayacak bashama gerektirmez bash.

Bir varyasyon: boşluklar yerine eğik çizgilerle birleştirme

Ayarlayarak boşluklardan başka bir karaktere geçebiliriz IFS:

$ cat script.sh 
#!/bin/sh
old="$IFS"
IFS='/'
str="'$*'"
echo "$str"
IFS=$old

Örneğin:

$ sh script.sh one two three four       
'one/two/three/four'

Tamam, bu harika çalıştı ve tam olarak ihtiyacım olanı yaptım. Bunu sadece argümanları kullanarak adında boşlukları olan bir dizine değiştirmek için kullanmaya çalışıyorum. Nihayetinde bunun için gerekli olan şey, eğer dizinde boşluk bırakılmışsa, kesme işaretlerini yazmak zorunda kalmadan dizinleri değiştirecek bir fonksiyon yaratmaktı. Yeni denediğim şey şuydu: cdm () {str = "'$ *'" cd $ str} Sadece
str'deki

@Schwagmister: İsterseniz bir (string) değişkeni içine kaydedebilirsiniz, ancak özellikle yapmanız gerekmiyorsa, cd "$*"yeterince iyi olacağını düşünüyorum .
Scott,

@Schwagmister Tek tırnak orada yardımcı değil. Deneyin: cdm(){ str="$*"; cd "$str"; }ya da Scott'ın önerdiği gibi cdm(){ cd "$*"; }. Ayrıca, $*art arda birden çok boşluğu tek bir boşlukla değiştirdiğinin farkında olun . Dizin adınız arka arkaya birden fazla boşluk veya sekme veya yeni satır içeriyorsa, bu karakterlerin gerçekten işleve geçilmeden önce kaçmaları gerekir cdm.
John1024,

Peki deneme 2 deneme 1 gibi bir şeyse, bu cd komutunun doğru çalışmasını nasıl sağlayabilirim? Ayrıca bu inanılmaz bir yardım, gerçekten minnettarım millet. @Scott
Schwagmister

En iyi şekilde @Schwagmister çağrılırken komut satırında tek tırnak koymaktır cdmolduğu gibi: cdm 'test 2 trial 1'. Bu garip isimlerin tüm malikâne idare edecek. Ancak, beyaz boşluklar tek boşluklarla sınırlı olduğu sürece, o cdmzaman olduğu gibi çalıştırılabilir cdm test 2 trial 1.
John1024,

5

Düşündüğünden daha kolay:

#!/bin/bash
array="${@}"

echo $array

chmod + x, ve çalıştırın:

$ ./example.sh --foo bar -b az 
--foo bar -b az
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.