コマンドを変数に保存しようとすると、中括弧は消えます。

コマンドを変数に保存しようとすると、中括弧は消えます。

いくつかの操作の後にコマンドを印刷し、後で使用するために別の変数に保存したいと思います。使い方はこんな感じです。

source new.sh tmp

new.shの内容:

#!/bin/sh

 set a = `cat $1`
 echo $a

cat $1私の実際のユースケースはgrepとsedコマンドの組み合わせではありません。

TMPの内容:

hello world !!! {curly}braces missed

現在の出力:

hello world !!! curlybraces missed

理想的な出力は、入力ファイルtmpを変更せずに中括弧を維持することです。よろしくお願いします。

答え1

source new.sh tmp

sourceスクリプトはインタラクティブシェルに関係なく実行されるため、hashbang行にシェルを設定しても#!/bin/sh効果がなく、誤解を招く可能性があります。

set a = `cat $1`

名前付き変数を設定するためのcsh構文ですa。 sh では$1位置引数(等)をa=... に設定します。からいくつかの値を取得するので、aこれはcshを実行しているか、a以前にインタラクティブシェルで他のものを設定したことを意味します。

hello world !!! {curly}braces missed
hello world !!! curlybraces missed

ミスカッコは、私のcshで拡張が引用されていない場合に正確に発生します。

% set a = '{curly}braces'
% echo $a
curlybraces

これはおそらくcshが中括弧拡張を処理する方法です。 Bash と ksh は、中にカンマがない場合は中かっこを拡張しません。

したがって、cshでは次のものを引用する必要があるようです。

set a = "`cat $1`"
echo $a

私はcshについてよくわからないので、これはまだ間違っているかもしれません。

または本当にshを使用したい場合は、次のようにする必要があります。

#!/bin/sh
a=$(cat "$1")
echo "$a"

次のようにスクリプトを実行する必要があります./new.shsource

(エコの代わりに `printf "%s\n" "$a" を使う方が良いでしょう。)

関連情報