私が制御できないいくつかの操作の結果である文字列があります。を使用してこの変数を印刷すると、次のecho
結果が得られます。
echo $myvar
hello
しかし、私がするとき
if [ $myvar = "hello" ]; then
echo they are equal
else
echo they are not equal
fi
私はいつも彼らが等しくないと感じます。性格のせいだと思いますnewline
。
文字列も奇妙に動作します。私がするとき:
newVAR="this is my var twice: "$myvar$myvar
echo $newVAR
私は得る:
hellois my var twice: hello
これが実際にaとによるものかどうかを確認するにはどうすればよいですかnewline
?では、削除する必要がありますか?
答え1
問題は、キャリッジリターン(CR、\r
)が含まれていることです。これにより、端末テキスト挿入ポイントが印刷中の行の先頭に戻ります。これが、例の行の先頭に「hello」が表示される理由です。$newVAR
これはsed -n l
、印刷できない文字(および行末)を表示する読み取り可能なビューです。
var=ab$'\r'c ; echo "$var"; printf %s "$var" | sed -n l
# output:
cb
ab\rc$
単純なbash条件付きチェックでテストできます。
[[ $var == *$'\r'* ]] && echo yes || echo no
# output:
yes
\r
以下を使用してテストを実行および削除して、テストと修正を単一のステップにまとめることができます。
fix="${var//$'\r'/}"; echo "$var"; echo "$fix"
# output:
cb
abc
これ固定する使用シェルパラメータ拡張。上記で使用した特定の形式は、指定したパターンに基づいて部分文字列を置き換えるために使用されます。${parameter/pattern/string}
<-- これは最初に見つかったものだけを置き換えます。模様そしてひも*parameterという変数にあります。変えるみんなモードでは、最初の項目/
を//
。
答え2
Bash\r
では、次のように話すことができます。$'\r'
if [ "$myvar" = "hello"$'\r' ]; then
echo they are equal
else
echo they are not equal
fi
または\r
最後の部分を切り取りますmyvar
。
if [ "${myvar%$'\r'*}" = "hello" ]; then
echo they are equal
else
echo they are not equal
fi
答え3
奇妙なことに、多くの殻にはgetopts
そのような職業の候補者がいるようです。一見すると直観に反しているように見えるかもしれませんが、getopts
主な機能が一連の同じリンクオプションで見つけることができるだけ指定された単一文字のコマンドラインオプションを識別して解釈を提供すると考えると、次のような結果が出ることがあります。もう少し意味があります。
bash
シェルでデモンストレーションするには:
x=$(printf '\n\r%010s\t' hello)
OPTIND=1
while getopts : na "-$x"
do printf %q\\n "$OPTARG"
done
$'\n'
$'\r'
\
\
\
\
\
h
e
l
l
o
$'\t'
このように、このgetopts
ような状況では、分解を一種のシェル自動操縦装置で処理することが時々便利である。これにより、不要なバイトを直接フィルタリングしたり、case
バイト1で文字列バックアップを[
テストして構築したりできます。]
OPTIND=1 y=$(printf \\n\\r) z=
while getopts : na "-$x"
do case $OPTARG in ([!$y])
z=$z$OPTARG
esac
done
printf %q\\n "$z"
$' hello\t'
この簡単な例とすでに他の場所で述べたように、パラメータ拡張をサポートするシェルがある場合、拡張はおそらくここでうまく機能します。しかしgetopts
、これに関して何をしているのかわからない場合は、言及する価値があると思いました。もちろん、それについて学びながら、私はそれのための便利なアプリケーションをたくさん見つけました。
答え4
Bashや他のシェル言語は便利ですが、時にはPerlのような実際のスクリプト言語を使う方が良いでしょう。 Perlは、UNIXコマンドだけでなく、他の言語(sedやawkなど)を呼び出すシェルスクリプトを非常に簡単に置き換えることができます。私は、20年前にsed、awk、およびFORTRANコードと呼ばれるさまざまなUNIXコマンドを呼び出すC-Shellスクリプトを作成し、これを学びました。 Perlでは、次のようにします。
chomp($myvar); # removes the newline char
if("$myvar" eq "hello") # string comparison
{
print "they are equal\n";
}
else
{
print "they are not equal\n";
}