Bashの評価文字列内のドル記号

Bashの評価文字列内のドル記号

名前の最初の文字には、ドル記号(たとえば)を含む数百のサブディレクトリがあり、各$ディレクトリにアクセスする必要があります。これらのサブディレクトリの名前は変更できません。 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ため、ここで使用する必要はありません。PWDpwd

関連情報