メインスクリプトを取得し、メインスクリプトで使用できる関数に引数を渡し、関数定義を実行するサブスクリプトがあります。関数呼び出しは正常に機能しますが、次の問題が発生します。
最初の
echo
明細書は印刷されません。下付き文字パラメーターの変数が
now
確認されていません。以下で私の結果を見つけてください。
メインスクリプト
Function_1 ()
{
cd /home/test/
File_name="$1".txt
if [[ "$File_name" =~ ^[[:alnum:]][[$_."#&']] ]]; then
echo " For your Info, File name can be alpha numeric and can contain special characters like $_."&'#" please proceed "
fi
if [[ -f "$File_name" ]];
then
echo "File Name - $File_name"
else
echo "File Name - $File_name doesn't exists"
fi
}
下付き文字
export now=$( date '+%Y%m%d' )
Function_1 'abc_${now}'
予想される結果
For your Info, File name can be alpha numeric and can contain special characters like $_."&'#" please proceed
File Name - abc_20200204.txt
実際の結果
File Name - abc_$now.txt doesn't exists
答え1
if [[ "$File_name" =~ ^[[:alnum:]][[$_."#&']] ]]; then
"
aとaを使用しているため、'
式は不完全で失敗します。
答え2
あなたが経験している問題は、一般的に処理の問題によるものかもしれません。特殊文字そして引用するシェルスクリプトから。
主な説明:サブスクリプションが基本スクリプトの関数にどのようにアクセスするかについては言及していませんが、次のことを行ったとします。
~$ source main_script.sh
~$ export now=$( date '+%Y%m%d' )
~$ Function_1 'abc_${now}'
これにより、シェルで複数の構文エラーが発生し、スクリプトが機能しなくなります。私はあなたがbash
そのタグを使用して以来あなたもそうしたと仮定しており、これらのエラーが発生しなかったという事実に驚いたことを認めています。shellcheck
次のツールの使用を検討することもできます。オンラインあるいは、シェルスクリプトをチェックするための多くのLinuxディストリビューションのパッケージとして、タイプミスなどを見つけるのにも役立ちます。
今起こった問題について話してください。
最初の出力は決して発生しないと述べましたecho
。私はこれが正規表現の構成と特殊文字の使用に関連していると思います。
- テストステートメントは、
[[ "$File_name" =~ ^[[:alnum:]][[$_."#&']] ]]
シェル特殊文字を含む文字のリストを使用します。たとえば、次のようになります。[$_."#&']
$_
最後のシェル引数として解釈されましたと二重引用符は、シェルによってコマンドの最初の行と一緒に次の行で終わる"
リテラル文字列の先頭として解釈されます。シェルは、私が試したときにシェルが提案したように出力メッセージを解釈しようとするため、構文エラーが発生します。に示すように、シェルが望ましくない解釈を防ぐために、これらの文字をエスケープする必要があります。"
echo
\$_\"\#\&\'
- また、角かっこを使用して
[[ ... ]]
文字のリストを表すこともできます。しかし、これは構文的に定義されていません。何はい[ ... ]
1 つの文字のみを含むリストを定義します。特徴クラス、例えば[:alnum:]
。これ[[:alnum:]]
ある種の構文は、正規表現の最初の部分で行ったように実際に書かれています。したがって、「外側」の角かっこのペアを省略する必要があります。 - 「startアンカー」を使って正規表現を開始しました
^
。だから私はあなたがファイル名を受け入れたいと思います。スタート一般文字または数字が含まれていますが、前述の特殊文字をすべて含めることができます。ただし、正規表現は次に始まるファイル名のみを受け入れます。一つ英数字必要2番目の文字として特殊文字の1つです。英数字に加えて、任意の数の文字が許可されていることを確認するには、次のように作成します^[[:alnum:]][[:alnum:]\$_.\"\#\&\']*$
。 2番目の部分は、[ ... ]
文字クラスと文字を含む[:alnum:]
文字のリストです。また特殊文字$
、、、、、、およびは文字_
列の最後まで()まで0回以上()です。最後のアンカー文字は以下を保証します。.
"
#
&
'
*
$
みんなファイル名には許可された文字のみが含まれます。
次のポイントは、${now}
変数が解決されないことに関連しています(例:「拡張する」シェル用語で)。
いくつかのコメントですでに指摘されているように、パラメータ拡張は一重引用符内では発生しません
' ... '
。二重引用符を使用すると、" ... "
変数拡張が機能します。この時点で一重引用符が必要なようです。この場合、追加の説明が必要な場合があります。なぜ一重引用符が必要です(たとえば、達成したい内容または式をさらに処理するかどうか)。
'abc_${now}'
含む後でプロセスに参照が必要です。)