
数値リストの最初または2番目のフィールドが146であることを確認するために、次の行を作成しました。
から行を実行したいですtcsh
。そのうちの1つはで説明されていますbash
。
ここで問題は何ですか?
echo $numbers
146 146 0 16 16 10 42 12 10 32 32 3 2 32 26
tcsh
bash -c 'for i in 1 2; do if [ 146 = `echo $numbers | cut -f$i -d' ' ` ]; then echo "NUM is OK "; fi done'
間違い:
` ]; then echo "NUM is OK "; fi done: -c: line 0: unexpected EOF while looking for matching ``'
` ]; then echo "NUM is OK "; fi done: -c: line 1: syntax error: unexpected end of file
答え1
「スクリプト」にはいくつかの問題があります。最大の問題は、'
ある種のエスケープが必要であるということです。二重引用符で囲まれた文字列内のバックティックの内側は面倒です。
$()
代わりに逆引用符を使用し、二重引用符を区切り文字として使用しない限り、これを完全に回避できます。
... if [ 146 -eq $(echo $numbers | cut -f$i -d\ ) ]; then ...
これは-eq
数値の適切な述語であるため、正しく機能するにはエクスポート$numbers
する必要があります。
適切なスクリプトを作成してそこから呼び出すのがtcsh
最善です。
答え2
問題は一重引用符(完全なコマンドセットをラップするために使用されます)にあります。一重引用符と二重引用符の違いは、二重引用符では変数と逆引用符コマンドがその値に置き換えられますが、一重引用符では文字列がそのまま処理されることです。
あなたはそれを使用することができます:
bash -c "for i in 1 2; do if [ 146 = `echo $numbers | cut -f$i -d' ' ` ]; then echo 'NUM is OK '; fi done"
答え3
どうですかgrep
?これは静的な問題ですか、それとも数字と標準が変わりますか?
静的なケース:
echo $numbers | grep -c '(^146\s)|(^\d+\s146\s)'
一致するかどうかに応じて 0 または 1 を返します。
テストされていませんが、最初または2番目のフィールドと一致する必要があります。より効率的かもしれませんが、動作に近づく必要がある他のモードがあります。