将命令分配给变量

将命令分配给变量

我将命令分配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

相关内容