名前の最初の文字には、ドル記号(たとえば)を含む数百のサブディレクトリがあり、各$
ディレクトリにアクセスする必要があります。これらのサブディレクトリの名前は変更できません。 bashスクリプト機能はそれぞれにアクセスしようとし(今まで)、そのパスをエコーします。設定されたパス文字列を使用してこれを実行して評価します。
印刷された行は期待どおりに表示されcmd=${cmd}
ますcmd=cd /rbyoko/c/$Ono.RCB
。ただし、evalコマンドは誤って解釈され$Ono.RCB
($Ono
空のvarになる可能性があります)、結果は次のようになります。その後、スクリプトが実行されている場所から-bash: cd: /rbyoko/c/.BIN/: No such file or directory
次の行が印刷されます。We are in /home/user
$
私の質問:実際に必要なサブディレクトリに正常にアクセスするには、文字列を評価(および/またはエスケープされたサブディレクトリを使用)するにはどうすればよいですか?
これは私の機能です。
visit_tree_recbin()
{
strings="cdhlotpw"
MACHINE=`uname -a`
PWD=`pwd`
for i in $(seq 1 ${#strings})
do
c="${strings:i-1:1}"
echo "Letter $i: $c"
#build eval string to do: cd "/rbyoko/${c}/\$Ono.RCB/"
x1="cd /rbyoko/${c}/"
x2="\$"
x3="Ono.RCB/"
cmd="${x1}${x2}${x3}"
echo "cmd=${cmd}"
eval "${x1}${x2}${x3}"
echo "We are in " `pwd`
done
}
答え1
変数に保存されたコマンドを実行しないでください(単純なコマンド名および/またはパスでない場合)正しく引用しない限り(これは退屈でより堅牢なコードになる可能性があります)、興味深い方法で失敗します。
あなたの場合はこれで十分です
cd "/rbyoko/$c/\$Ono.RCB"
つまり、ディレクトリパス名を引用して($c
スペースを許可するために)エスケープします$
。
または:
cd "/rbyoko/$c"/'$Ono.RCB'
つまり、シェルからビットを保護するには、ドル記号でビットを一重引用符で囲みます。
あなたの機能が修正されました:
visit_tree_recbin () {
for dir in c d h l o t p w; do
cd "/rbyoko/$dir"/'$Ono.RCB'
printf 'We are now in %s\n' "$PWD"
done
}
または、
visit_tree_recbin () {
for dirpath in /rbyoko/[cdhlotpw]/'$Ono.RCB'/; do
cd "$dirpath"
printf 'We are now in %s\n' "$PWD"
done
}
違いは、最初のバリアントがディレクトリパス名を生成してcd
そこに入ることです。ディレクトリがないと失敗する可能性があります。
2番目のバリアントは、一致するファイル名のワイルドカードパターンを使用します。既存の目次。パターンが一致するものがあれば成功します(ディレクトリに入るcd
権限がある場合)。cd
現在の作業ディレクトリのパス名を含む変数が保持されるbash
ため、ここで使用する必要はありません。PWD
pwd