我将命令分配ls
给我的变量my_File
,但是当我运行它时$my_File
它不起作用。你能解释一下为什么吗?
#!/bin/bash
my_File='ls -f | grep -v '\/''
$my_File
答案1
您编写的行定义了一个变量,其值为 string ls -f | grep -v /
。当您不加引号地使用它时,它会扩展为单词列表(字符串在空格处分割):ls
, -f
, |
, grep
, -v
, /
。该|
字符并不特殊,因为 shell 正在分割字符串,而不是解析它,因此它成为命令的第二个参数ls
。
您不能将命令填充到这样的字符串中。要定义命令的短名称,请使用别名(如果命令完整)或函数(如果命令有参数并且不仅仅是将一些默认参数传递给单个命令)。在你的情况下,一个别名就可以了。
alias my_File='ls -f | grep -v /'
my_File
答案2
$ my_File='ls -f | grep -v '\/''
$ $my_File
ls: cannot access |: No such file or directory
ls: cannot access grep: No such file or directory
[snip]
在解释 时$my_File
,bash 将其中的字符视为普通字符。因此,首先,命令行|
中有一个文字字符,而不是管道。
如果您尝试$my_File
在命令行上执行并使管道正常工作,则需要eval $my_File
.
答案3
echo "${var='ls -f | grep -v "\/"'}" |sh
您当然需要一名口译员 - 尽管不一定eval
。
. <<-HEREDOC /dev/stdin
$var
HEREDOC
echo "$var" | . /dev/stdin
有很多方法可以到达那里。
${0#-} -c "$var"
sh - c "$var"
答案4
变量=command
反引号字符(`)
就像 var = pwd
echo $var = /home/user/foo