
数行のコードがあります。$1
ループがあるファイルにパラメータがあるかどうかを確認したいので、while
このコードを書きました。
#!/bin/bash
if [ ! -z $1 ]
then
update=$1;
while read line
do
if [ $update == $line ]
then
echo "yes";
fi
done<./available_updates
fi
しかし、デバッグ時に実行すると
[root@pc bagheri]# bash -x ./test.sh my_value
それは言う:
+ '[' my_value == 'my_value' ']'
「is」という単語を印刷するのではなく、2つの一重引用符のために条件をスキップしますが、ファイルがファイルに存在するとmy_value
100%確信しています。available_updates
この問題についてどうすればよいですか?
答え1
#! /bin/sh -
update="${1?missing update argument}"
grep -Fxqe "$update" < available_updates && echo yes
コードに関するいくつかの問題:
- パラメータ拡張は、Bourneなどのシェルから引用する必要があります。
- 1行を読む構文は
read
isIFS= read -r line
、notですread line
。 - 構文の場合は、スクリプトに1つ以上のパラメータが提供されていることを確認してください
[ "$#" -gt 0 ]
(方法も参照${1?error message}
)。[ ! -z "$1" ]
(ここに欠落している引用符を追加してください。)最初の引用符が空でないことを確認してください。
出力に表示される内容はコマンドに渡されたデータの一部ではなく'
、表示された内容が有効なシェルコードを構成していることを確認するために出力されます。これは、単にそこにあるのではなく、引用が必要と見なされる他の見えない文字がある可能性があることを示しています。 「バイト順表示」文字であるU+FEFFのようなものかもしれません。xtrace
[
$line
my_value
bash
ランニングは目にLC_ALL=C sed -n l < available-updates
見えない数値を明らかにするのに役立ちます。