カットコマンドを変数に保存できない理由を誰か説明できますか?
user:~$ echo "foo bii doo" | cut -d ' ' -f 2
bii # as expected
# now put cut command into a variable:
user:~$ c="cut -d ' ' -f 2"
user:~$ echo "foo bii doo" | $c
cut: "'": No such file or directory
user:~$ c="cut -d \ -f 2"
user:~$ echo "foo bii doo" | $c
foo bii doo
trは有効なので、これは一般的な引用の問題ではありません。
user:~$ t="tr -d 'oo'"
user:~$ echo "foo bii doo" | $t
f bii d
(私はDebian 12でbashを使用しています。)
この問題は他の方法で解決されました。なぜデバッグ時間を3時間も無駄にしたのか知りたいです:)
答え1
どのように見て、これは引用の問題ではなく、拡張の問題です。変数拡張はテキスト置換ではなく、変数から得られたデータは次のとおりです。いいえコードで解析します。これは、引用符、バックスラッシュエスケープ、または他のシェル構文が処理されないことを意味します。代わりに、拡張値は空白(すべての空白)にトークン化されます。これは、トークン化を使用して1つの文字列に複数のランダムな文字列を格納できないことを意味します。
tr
使用したコマンド〜らしい引数に一重引用符を追加してもo
sの操作は変更されないため、機能します。 Chris Davisがコメントで述べたように、
$ t="tr -d 'oo'"
$ echo "don't forget" | $t
dnt frget
tr
削除する文字のリストに引用符が含まれていることを確認できます。引数ではなく引数がtr
あります。スペースを削除するには、次の問題が発生します。'oo'
oo
tr
cut
$ t="tr -d ' '"
$ echo "don't forget" | $t
usage: tr [-Ccsu] string1 string2
tr [-Ccu] -d string1
tr [-Ccu] -s string1
tr [-Ccu] -ds string1 string2
、およびtr
3つの引数を使用して実行しようとしましたが、これは使用方法と一致しないため、使用法ヘルプを印刷します。-d
'
'
これを行う方法は、次の関数を書くことです。
c() {
cut -d \ -f 2
}
echo "foo bii doo" | c
与えるbii
。
望むより: