ローカル変数とリモート変数の混合と正しい使い方と参照

ローカル変数とリモート変数の混合と正しい使い方と参照

私が知る限り、bashで推奨されるパターンは常にシェル変数を引用することです。
例えば。"$VAR"​ 代わりに、引用符が解釈される変数に提供するのと同じ安全性をどのように取得できますか?$VAR
離れて
たとえば、次のようになります。

ssh server.com<<CODE
TARGET="target dir"
COUNT= \$( ls /foo/bar/\$TARGET | wc -l )  
echo \$COUNT > count.txt    

CODE   

コードが機能するには、および$COUNTをエスケープする必要があります$TARGET
しかし、この特定のケースに対して「$COUNT」または「$TARGET」が提供するのと同じセキュリティをどのように達成できますか?

修正する
問題のある部分だけを貼り付けました。
変数が区切られた文書の外側に定義された他の行があるため<<'CODE'
より完全な例:

SOME_STRING="SOME VALUE"  
ssh server.com<<CODE  
echo $SOME_VALUE > test_file.txt  # <--- does not work if I use <<'CODE'
TARGET="target dir"
COUNT= \$( ls /foo/bar/\$TARGET | wc -l )  
echo \$COUNT > count.txt    

CODE   

答え1

この記事では二重引用符が保持されているようです。たとえば、次のコマンドを考えてみましょう。

cat <<HEREDOC
"this will still be quoted"
HEREDOC

これにより、出力として次の引用符付き文字列が生成されます。

"this will still be quoted:

したがって、通常どおり変数を参照できる必要があります。

SOME_STRING="SOME VALUE"
ssh server.com<<CODE
echo "$SOME_VALUE" > test_file.txt
TARGET="target dir"
COUNT="\$( ls /foo/bar/\$TARGET | wc -l )"
echo "\$COUNT" > count.txt
CODE

コマンド置換で変数を参照する方法については、次の記事を参照してください。Bashで$(コマンドを置き換える)内で引用

SOME_STRINGコードスニペットをそのままコピーしましたが、代わりに変数を使用しようとしていたようですSOME_VALUE。以下は、ローカルで実行して予想される結果を得るために少し変更されたコードの一部です。

mkdir -p "/foo/bar/target dir"

SOME_STRING="SOME VALUE"
ssh localhost<<CODE
echo "$SOME_STRING" > test_file.txt
TARGET="target dir"
COUNT="\$( ls "/foo/bar/\$TARGET" | wc -l )"
echo "\$COUNT" > count.txt
CODE

答え2

過去数日間、私たちはこの問題について多くの異なる意見を持っているようです。

その場合は、ここにある文書を引用してください。

ssh server.com <<'CODE'
TARGET="target dir"
COUNT= $( ls /foo/bar/$TARGET | wc -l )  
echo $COUNT > count.txt    
then  
fi  
CODE  

'CODE'(onlyとは反対)CODEは、変数を拡張したりコマンド置換を実行したりすることなく、hereドキュメントが作成されたとおりにユーティリティに渡されるようにします。

ここのドキュメントにも構文エラーがあります(周囲のスペース=と不一致ifthen。また、通常どおり拡張を$COUNT二重引用符で囲む必要があります$TARGET

ssh server.com <<'CODE'
TARGET="target dir"
COUNT=$( ls "/foo/bar/$TARGET" | wc -l )  
printf '%s\n' "$COUNT" >count.txt    
CODE 

リモートディレクトリのファイル数を数える場合は、次のコマンドを使用します。

ssh server 'find "/path/to/dir" -maxdepth 1 -type f -exec echo . \;' | wc -l

これは正しく計算されます/path/to/dir

結果をリモートファイルに書き込むには:

ssh server 'find "/path/to/dir" -maxdepth 1 -type f -exec echo . \; | wc -l >file'

リモートで実行する必要があるコードが非常に複雑な場合は、サーバーでスクリプトを作成して実行する方が良いかもしれません。スクリプトに渡す必要がある変数は、コマンドラインから渡すことができます。

ssh server ./script.sh "$SOME_VARIABLE"

スクリプト:

#!/bin/sh

VAR="$1"

# do stuff

関連情報