2011-08-08 7 views
5

Linux/Bash: Nasıl unquote için? Aşağıdaki komutlar ile

echo 'a b' 'c' 

çıkışları

a b c 

Ama bir yolunu arıyorum

X="'a b' 'c'" 
echo $X; 

'a b' 'c' 

çıktılamak edecek aşağıdaki unquote $ X, bu çıktı "a b c", ama birleşti 'a b' argümanı kaybetmeden olacak şekilde yerleştirin. (= 2 argümanlar yerine 3, komutun 'yankı' için hiç fark etmez, ama 'cp' gibi diğer komutlar için)

+2

echo $ {X // \ '/}; // a b c –

cevap

7

deneyin Xargs:

$ echo $x 
'a b' 'c' 

$ echo $x | xargs ./echo 
argc = 3 
argv[0] = ./echo 
argv[1] = a b 
argv[2] = c 
+0

Not: xargs işlemin çıkış durumunu döndüremez. Herhangi bir hata 1-125 123 olarak gösterilecektir. (Muhtemelen hiçbir geçici çözüm mevcut) Muhtemelen eval yerine kullanacağım, –

0

Bu kıllı, etrafa çalışan öneririm Sorun ve ilk etapta "ab" ve "c" ile bitmez.

7
eval echo $x 

bu ilk argüman ikincisi

Not olarak c olarak a b geçecek: bu aslında argümanları değerlendirecektir, örneğin:

$ x='$((3+5))' 
$ eval echo $x 
8 

bu değil Eğer vanza yıllardan @ kullanmak istediğini xargs.

+0

çıkış kodunu kullanabilmeniz için teşekkürler. Henüz "eval" kullanmamıştım, ama xargs'ın script-enjeksiyonlarına göre daha güvenli olduğu görülüyor. –

0
X="'a b' 'c'" 
echo $X 
eval "echo $X" 

Eğer X muhtemelen \"$ veya ters tırnakların gibi özel karakterler içerebilir eğer dikkatli olmak zorunda bu kodu kullanın.

0

echo'un echo $X 2 parametresini aldığından emin misiniz?

X="'a b' 'c'" 
function f(){ echo $#; echo $1; echo $2; echo $3; } 
f $X 

görüntüler:

3 
'a 
b' 
'c' 

3 parametreler 'a, b' ve 'c' olan Benim için, 3. aldığı deneyelim. Beklediğiniz şey olduğunu düşünmüyorum. Eğer varsa,

X="a b|c" 
IFS="|" 
function f(){ echo $#; echo $1; echo $2; } 
f $X 
1

Genellikle: Bir çok parametre değişkeni oluşturmak istiyorsanız

, siz (belki |) kullanabilir ve değişken bir parametre ayırıcı olarak kullanmayacağız bir char IFS set

X=('a b' 'c') 
printf "%s\n" "${X[@]}" 

baskılar:

tek bir değişken birden 'kelimelerini' saklamak çalışıyorsun, önerilen yöntem gömülü tırnak kullanmak, ancak bir dizi kullanmak değildir
0

Ayrıca, [email protected] konumsal parametre dizisine argümanları yeniden değerlendirmek için xargs ve sh -c 'cmd' _ arg1 arg2 ... birleştirilebilir.xargs bittikten sonra

bir değişkene çıkışını Atama ve örneğin stderr son sürecin çıkış durumu $? şey ama yönlendirme, bunu bir değişkende son sürecin çıkış kodunu depolamak ve kullanmak mümkün kılar yürütme.

X="'a b' 'c'" 

ret="$(
export IFS='' 
set -o pipefail 
echo $X | xargs sh -c ' 
    for file in "[email protected]"; do 
     echo cp "$file" destdir 1>&2 || { echo $?; kill -HUP $PPID; exit $?; } 
     #(exit 3) || { echo $?; kill -HUP $PPID; exit $?; } 
     #(exit 3) || { echo $?; kill -HUP $PPID; kill -HUP -- -$$; } 
    done 
    echo $? 
' _ 
echo $? '|' ${PIPESTATUS[@]} 1>&2 
)" 
echo "$ret" | tail -1 
0

Lütfen böyle bir şey için eval kullanmayın. set parametrelerin bütünlüğünü koruyacak ve echo dışındaki komutlar onlarla iyi oynayacaktır. Aklınızda bulundurun, mevcut konum parametrelerine referans (lar) kaybedeceksiniz.

set -- "a b" "c" 
echo "[email protected]" 
#a b c 
echo $1 
#a b 
echo $2 
#c