Komutunuz belki de ortam değişkenlerini komut satırında verilen argümanlara göre ayarlıyor gibi görünüyor. Yapabileceğiniz olabilir:
CLUSTER=cl1; cluster=$CLUSTER command
... ve ortamını çağrılmada ayarladı.
Aksi takdirde, kabuk tırnakları genellikle bağımsız değişkenleri sınırlar veya kabuk yorumlamasından diğer özel kabuk karakterlerinden kaçar. Çeşitli kurallara dayanarak diğer türlerde farklı türlerde kabuk tırnakları içerebilir (ve bu nedenle kaçabilirsiniz) :
"''''"
- yumuşak tırnaklı bir dize herhangi bir sayıda sert tırnak içerebilir.
"\""
- \
ters eğik çizgi, yumuşak tırnaklı bir dize "
içindeki yumuşak tırnaktan kaçabilir "
.
- Bu bağlamda, bir
\\
ters eğik çizgi de kendini, \$
genişleme belirtecini ve \n
aşağıda belirtildiği gibi ewlines'lardan kaçar , ancak tam anlamıyla tedavi edilir.
"${expand} and then some"
- yumuşak tırnaklı bir dize yorumlanmış bir kabuk $
genişletmesi içerebilir .
'"\'
- '
sert tırnak içine alınmış bir dize, sert tırnak dışında herhangi bir karakter içerebilir '
.
\
- \n
alıntılanmamış bir ters eğik çizgi, gerçek yorumlama için herhangi bir karakterden kaçar - hatta başka bir ters eğik çizgi - bir ewline hariç .
- Bir
\\n
ewline durumunda, hem \
ters eğik çizgi hem de \n
ewline, elde edilen yorumlanmış komuttan tamamen kaldırılır.
${parameter+expand "$parameter"}
- Bir kabuk genişlemesinden kaynaklanan alıntılar, neredeyse hiçbir zaman birkaç özel durum haricinde sınırlayıcı işaretleyici işlevi görmez. Bunları burada daha fazla açıklamak için girişimde bulunmayacağım.
Ben herhangi bir uygulamanın kendi komut satırı argümanlarında tırnak yorumlamak tuhaf olduğunu düşünüyorum. Böyle bir uygulama, en azından mermiler için, bir teklifin birincil amacının genellikle bir argümanı sınırlamak olduğu için çok anlamlı değildir. Çağırma anda, ancak, argümanlar her zaman vardır zaten ayrılmış olan \0NUL
karakterler ve bir alıntı çok amaca hizmet edemez.
Bir kabuk bile, yalnızca bir -c
anahtarla çağrıldığında çağırma argümanlarından birinde tırnakları yorumlamakla uğraşacaktır - bu, ilk işleneninin aslında çağırma üzerine çalıştırması gereken bir kabuk komut dosyası olduğunu gösterir. Bu, iki kez değerlendirilen girdi örneğidir .
Tüm bunlar, komut satırındaki bağımsız değişkenler aracılığıyla gerçek tırnak işaretleri geçirmek için birkaç şey yapabilirsiniz. Örneğin:
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"
Daha önce bir yorumda belirttiğim gibi, "
tırnak işaretlerini kendi içinde belirtilen bir genişletme içinde içerebilir "
.
CLUSTER=cl1; command -p "cluster=\"$CLUSTER\""
Alıntılanan dize içinde ters eğik çizgi "
ile kaçabilirsiniz .\
"
CLUSTER=cl1; command -p cluster='"'"$CLUSTER"'"'
Yukarıdaki @jimmij notları olarak istediğiniz son sonuca ulaşmak için alıntı stillerini değiştirebilir ve birleştirebilirsiniz .
CLUSTER=cl1; ( set -f; IFS=; command -p cluster=\"$CLUSTER\" )
Her iki devre dışı bırakabilir dosya adı oluşturulması ve $IFS
bu suretle alıntı yapmak ihtiyacını kaçınarak - bölme $expansion
hiç - ve böylece sadece tırnak alıntı. Muhtemelen aşırıya kaçmış.
Son olarak, kullanılabilecek başka bir kabuk-alıntı türü vardır. Daha önce de belirttiğim gibi sh -c "$scriptlet"
, kabuk çağırma biçimi genellikle komut satırında bir kabuk komut dosyası sağlamak için kullanılır. Ancak $scriptlet
, tırnak işaretleri başka tırnaklar içermesi gerektiği gibi karmaşıklaştığında, burada bir belgenin kullanılması genellikle avantajlı olabilir ve sh -s
bunun yerine, kabuğa aşağıdaki tüm işlenenleri bir -c
durumda olduğu gibi konum parametrelerine ataması talimatı verilir. henüz senaryosunu da almamış stdin
.
Komutunuz tırnakları bu şekilde yorumlamalıysa, o zaman bir dosya girişinde yapabilirse daha iyi düşünürdüm. Örneğin:
CLUSTER=cl1
command --stdin <<-SCRIPT
cluster="$CLUSTER"
SCRIPT
Eğer a sınırlayıcı alıntı yoksa <<here-document
onlar gibi içeriği neredeyse tam davranılır tüm o "
- yumuşak alıntılanan haricinde o "
kendilerini özel olarak ele edilmez çift tırnak. Ve cat
bunun yerine yukarıdaki ile çalışırsak :
CLUSTER=cl1
cat <<-SCRIPT
cluster="$CLUSTER"
SCRIPT
... yazdırıyor ...
cluster="cl1"
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"