6

シェルスクリプトで実行される次のコードがあります

foo=`seq 1 1 100`
for i in $foo; do
  echo "input$i\_now"
done

ここに私の質問があります:ある条件下では、出力は印刷されますが、input1_nowそうでない場合は印刷されinput1\_nowます。何かが違うと確信していますが、何が原因でどちらの方法で印刷されるのかわかりません。私のコードが

for i in $foo; do
   echo "input$i_now"
done

input行の残りの部分を省略して、常に取得します。

代わりに使用input${i}_nowして毎回正しく印刷できることはわかっていますが、一見同じ条件下で出力が異なる理由を理解することに主に関心があります。

アップデート:

次の例では、最初の部分で変数とテキストが正しくフォーマットされており、\_が に置き換えられてい_ます。ただし、最後の部分では、変数を正しくフォーマットするために、変数を中括弧で囲む必要がありました。

echo "Enter Simulation #: "
read sim

g.mapset results

for i in `seq 1 1 100`; do

file=sim$sim\_run$i\_sum
g.copy $file\@expSim$sim\_$i,$file

file=sim$sim\_run$i\_average
g.copy $file\@expSim$sim\_$i,$file

for year in `seq 2004 1 2006`; do   

    file=sim$sim\_$year\_run$i\_sum
    g.copy $file\@expSim$sim\_$i,$file

    file=sim$sim\_$year\_run$i\_average
    g.copy $file\@expSim$sim\_$i,$file

done

years="2004 2005 2006"
times=`seq -w 1 16 365`
runs=`seq 1 1 100`

for year in $years; do
for ptime in $times; do
    for i in $runs; do
        if [ $i -eq 1 ]; then
            g.copy  vect=sim${sim}_pts_${year}_${ptime}_run${i}@expSim${sim}_${i},sim${sim}_pts_${year}_${ptime}
        fi
        if [ $i -gt  1 ]; then  
        v.patch input=sim${sim}_pts_${year}_${ptime}_run${i}@expSim${sim}_${i} output=sim${sim}_pts_${year}_${ptime} -e -a --o
        fi
    done
done
done
4

2 に答える 2

6

アンダースコアは bash 変数名で有効な文字であるため、変数名を周囲の文字から保護する必要があります。

foo=`seq 1 1 100`
for i in $foo; do
  echo "input${i}_now"
done

違い:

input$i_now    # "input" + $i_now
input${i}_now  # "input" + $i + "_now"
input"$i"_now  # input + "$i" + now
input$i\_now   # input + $1 + _now - \_ "escapes" the underscore

https://man7.org/linux/man-pages/man1/bash.1.html

name英数字とアンダースコアのみで構成され、英字またはアンダースコアで始まる 単語。識別子とも呼ばれます。

パラメータ名を保護する必要があります。パラメータ名で有効な文字を使用するかPREFIX${braces}SUFFIXPREFIX"$quotes"SUFFIXまたはエスケープします。\すべて「機能」しますが、ドキュメントが参照しているものでもあるブレースを好みます。

展開されるパラメーター名またはシンボルは中かっこで囲むことができます。これはオプションですが、名前の一部として解釈される可能性のある直後の文字から展開される変数を保護するのに役立ちます。

于 2013-04-16T07:14:27.447 に答える