ドット(.)を含むコマンドライン引数をどのように渡しますか?ドットのような文字をキャプチャするエスケープシーケンスはありますか?
シェルから次のbashスクリプトを呼び出すと機能しません。
# ./deploy.sh input.txt
./deploy.sh: line 9: input.txt: syntax error in expression (error token is ".txt")
私は以下を試しました:
- バックスラッシュ
- 引用する
- 二重引用符
- ./deploy.sh 入力(動作)
編集する
次のユースケースを例に挙げます。
- 3つのファイルがあります:server.jar client.jar gui.jar
- ソースからターゲットとしてSCPを指定する必要があります。
- ソースディレクトリ: login1@host1:/home/xyz/deploy/
- ターゲットディレクトリ: login2@host2:/data/apps/env/software/binary/
解決策:
- 配列にコピーするアーティファクトをコマンドラインから読み込みます。
- 正しいディレクトリプレフィックスを使用して、ターゲットパスとソースパス文字列を作成します。
- forループを使用して各アーティファクトをscpします(パスを検索)。
以下は、1(アーティファクトを配列として読み取る)を実行する簡単なスクリプトです。
#!/bin/bash
declare -a artifacts
for i
do
artifacts[i]=$i
echo ${artifacts[i]}
done
1を実行
-bash-3.00$ ./simple.sh arg1 arg2 arg3
arg1
arg2
arg3
ラン2
-bash-3.00$ ./simple.sh arg1.txt arg2.txt arg3.txt
./simple.sh: line 7: arg1.txt: syntax error in expression (error token is ".txt")
答え1
declare -A
代わりに使用する必要がありますdeclare -a
。明らかに、任意の文字列パラメータを持つ連想配列をインデックスとして使用していますが、declare -a
これは整数インデックス配列でのみ機能します。 arg.txt
有効な整数として評価されないため、エラーが発生します。
編集する
バージョン3を使用しているようですbash
。残念ながら、バージョン4までは連想配列を使用できませんでした。deploy.sh
他の人から代替案のアイデアを得るために、機密性の高い個人情報を削除した元のスクリプトの削除されたバージョンを公開することをお勧めします。
編集2
チャットで送受信した内容を簡単にまとめると、次のようになります。
すべてのパラメータに対していくつかの操作を実行する最も簡単な方法は、ループを使用して繰り返すことですfor
。
for arg; do
scp login1@host1:"$arg" login2@host2:/dest/
done
すべてのインスタンスを二重引用符で囲む必要があります"$arg"
。あなたはそうですいいえパラメータはすでに配列にあるため、直接配列に入れる必要があります$@
。これはfor
、明示的に指定しない場合にデフォルトで使用されますin list...
。
答え2
このエラーは、数値が必要な文字列を使用しようとするたびに発生します。
例えば
$((input.txt))
同じエラーが印刷されます。
あなたの場合は、数値でインデックス付けされた配列に割り当てていることがわかりました。
jw013 正しい説明するdeclare -A
例が機能するには(大文字A)を実行する必要があります。
理由:
配列要素に割り当てるときは、次のように書くのが一般的です。
array[0]=foo
array[1]=bar
しかし、あなたは何でも書くことができます算術表現キーとして、例えば次のようになります。
array[0+0]=foo
array[1+0]=bar
だからシェルは見る
array[input.txt]=input.txt
次の数字に変換してみてください。
$((input.txt))
そして失敗。
要点が混乱し、要点のない主張が妥当に見える理由は次のとおりです。
$((input))
実際に有効な数値です。
bash
を表示し、input
有効な変数名であることを確認し、変数が設定されていないことを確認してからに置き換えます0
。
と比較すると、input.txt
変数名にドットを含めることはできないため、有効な変数名ではありません!
このような混乱を避けるために、次のように使用できます。
set -u
これにより、存在しない変数を使用しようとするたびに、次のエラーが発生します。
set -u
artifacts[arg1]=arg1
印刷エラー
scriptname: line number: arg1: unbound variable