我想在一些操作后打印一个命令并将其存储到另一个变量中以供进一步使用。用法是这样的:
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
无论您的交互式 shell 是什么,都会运行脚本,因此 hashbang 行中设置的 shell#!/bin/sh
不起作用,并且会产生误导。
set a = `cat $1`
这是用于设置命名变量的 csh 语法a
。在 sh 中,它将位置参数($1
等)设置为a
, =
... 由于您在 中获得了一些值a
,这意味着您要么正在运行 csh,要么您a
之前在交互式 shell 中设置了其他内容。
hello world !!! {curly}braces missed
hello world !!! curlybraces missed
大括号丢失正是我的 csh 上未引用扩展时发生的情况:
% set a = '{curly}braces'
% echo $a
curlybraces
这可能就是 csh 处理大括号扩展的方式 Bash 和 ksh 不会在内部没有逗号的情况下扩展大括号,并且 Bash 在变量扩展或命令替换后也不会扩展大括号。
因此,在 csh 中,您似乎需要引用:
set a = "`cat $1`"
echo $a
我对 csh 并不了解,所以这可能仍然是错误的。
或者,如果您确实想使用 sh,那么应该是:
#!/bin/sh
a=$(cat "$1")
echo "$a"
你应该像这样运行脚本./new.sh
,而不需要source
(最好使用 `printf "%s\n" "$a" 而不是 echo。)