Unixシェルスクリプトから位置パラメータを読み取るときの$シンボルの問題

Unixシェルスクリプトから位置パラメータを読み取るときの$シンボルの問題

私は次のスクリプトを書いた。

#!/bin/bash

TEST=$1
TEST_1=$2

if [[ "$TEST" == e ]];then
echo $TEST_1
else
echo "Input is not e"
fi

今実行すると:

sh test.sh e NS3#$xX$56M

その後、出力は次のようになります。

NS3#56M

これにより、すべての$xX$文字が削除されます。特殊文字を含むすべての文字を取得する方法はありますか?

答え1

その理由は、あなたの言葉を引用しないからです。入力する。スクリプトに渡すパラメータにはが含まれており、パラメータ$は引用符なしで(たとえば、単にNS3#$xX$56M)渡します。これは以下の影響を受けるという意味です。変数拡張。これはシェルを解釈することを意味します。

sh test.sh e NS3#$xX$56M

test.shスクリプトを呼び出すコマンドは、最初に$xXその部分をシェル変数(ローカルに定義されているか環境変数にエクスポートされたもの)の内容に置き換えようxXとし、その部分がない可能性があるため、渡す前にその部分を「なし」に置き換えます。結果をスクリプトに追加します。しかし、これはシェルの正しい機能なので、@roaimaが指摘したように、スクリプトに大きな問題はありません。

この問題を回避するには、文字列を一重引用符で囲みます。これにより拡張が無効になります。

sh test.sh e 'NS3#$xX$56M'

スクリプトに関する一般的な注意事項は次のとおりです。

  • 変数名を環境にエクスポートすることを意図していない場合(つまり、test代わりに使用TEST)、変数名をすべて大文字として使用しないでください。これにより、スクリプト変数と潜在的に重要な環境変数との不要な競合を防ぐことができます。
  • 使用shellcheck、多くのLinuxディストリビューションでスクリプトを「校正」するためのスタンドアロンプ​​ログラムとしても使用できます。これは多くのエラーを防ぐのに役立ちます。
  • 発生した問題と判断すると、常にシェル変数を正しく引用してください。変数/グローバル拡張とトークン化が必要であることを明示的に知らない限り、それを使用してください。これは、スクリプトでシェル変数を使用する場合にも当てはまります。
  • このスクリプトを呼び出します。
    sh test.sh ....
    
    これは、-lineをオーバーライドし#!sh多くのシステムで演算子を理解しないPOSIX準拠のシェルであるシェルを使用します[[ ... ]]。たとえば、実行可能にし、 で呼び出すか、./test.sh明示的に使用しますbash test.sh

関連情報