Bash命令作为变量

时间:2013-05-08 13:59:49

标签: bash

我试图在这样的变量中存储sed命令的开头:

sedcmd="sed -i '' "

稍后我会执行如下命令:

   $sedcmd s/$orig_pkg/$package_name/g $f

它不起作用。使用bash -x运行脚本,我可以看到它正在扩展,如:

   sed -i ''\'''\''' 

表达这个的正确方法是什么?

5 个答案:

答案 0 :(得分:3)

定义shell函数:

mysed () {
    sed -i "" "$@"
}

并将其称为:

$ mysed s/$orig_pkg/$package_name/g $f

答案 1 :(得分:2)

当命令只有一个字长时,它可以工作:

$ LS=ls
$ $LS

但是在你的情况下,shell正在尝试执行不存在的程序 sed -i ''

解决方法是使用$SHELL -c

$ $SHELL -c "$LS"
total 0

(而不是$SHELL,你也可以说bash,但是当有多个Bash安装时,这并不完全可靠,shell实际上不是Bash等。)

但是,在大多数情况下,我实际上使用的是shell函数:

sedcmd () {
    sed -i '' "$@"
}

答案 2 :(得分:0)

为什么不使用别名或功能?你可以做别名

alias sedcmd="sed -i '' "

答案 3 :(得分:0)

这是做正确的方法

alias sedcmd="sed -i ''"

显然请记住,当你关闭你的bash时,这个别名就会消失 如果您想将其设为“永久”,则必须将其添加到.bashrc主文件(如果您只想为单个用户创建)或.bashrc全局文件,如果您愿意使其可供所有用户使用

答案 4 :(得分:0)

不完全确定你要做什么,但我的建议是:

sedcmd="sed -i "
$sedcmd s/$orig_pkg/$package_name/g $f

您必须先在shell中设置变量orig_pkg package_namef

如果您要替换文件中的变量名称,请尝试:

$sedcmd s/\$orig_pkg/\$package_name/g $f

必须将f设置为您正在处理的文件名。