我正在尝试使用自定义函数编辑我的.bashrc文件以启动xwin。我希望它能够在多个窗口中打开,所以我决定创建一个接受1个参数的函数:显示数字。这是我的代码:
function test(){
a=$(($1-0))
"xinit -- :$a -multiwindow -clipboard &"
}
我创建一个变量“a”来保存输入的原因是因为我怀疑输入是以字符串而不是数字的形式读入的。我希望采取我将输入减去0的步骤将字符串转换为整数,但我不确定它是否会。现在,当我打电话
test 0
我收到了错误
-bash: xinit -- :0 -multiwindow -clipboard &: command not found
我该如何解决这个问题?谢谢!
答案 0 :(得分:6)
因为整个引用的命令充当命令本身:
$ "ls"
a b c
$ "ls -1"
-bash: ls -1: command not found
删除xinit
周围的双引号:
xinit -- ":$a" -multiwindow -clipboard &
答案 1 :(得分:6)
除了主教指出的双引号外,这个函数还有其他一些问题:
test
是一个标准且非常重要的命令。 不要重新定义它!如果这样做,您可能会冒一些脚本(或源文件,或其他)运行:
if test $num -eq 5; then ...
将在某个随机窗口编号上触发xinit
,然后继续编写脚本,就好像$ num等于5(无论它是否实际存在)。这种方式就是疯狂。
正如chepner在评论中指出的那样,bash并没有真正的整数类型。对它来说,整数只是一个恰好只包含数字的字符串(前面可能是“ - ”),因此转换为整数是非运算的。但你可能想要做的是检查参数是否被取消。您可以检查$1
是否为空(例如if [[ -z "$1" ]]; then echo "Usage: ..." >&2
等),或者提供默认值,例如${1:-0}
function
(在这种情况下,“0”用作默认值)。
最后,请勿使用launchxwin() {
xinit -- ":${1:-0}" -multiwindow -clipboard &
}
关键字。 bash容忍它,但它是非标准的,并没有做任何有用的事情。
所以,这是我得到的功能的清理版本:
{{1}}
答案 2 :(得分:6)
这是因为bash将引号内的所有内容解释为String。命令是一个字符串数组,第一个元素是二进制文件或内部shell命令。数组中的后续字符串将作为参数。
键入时:
"xinit -- :$a -multiwindow -clipboard &"
shell认为你写的所有内容都是命令。根据您运行的命令/程序,所有其余参数可以是单个字符串。但是,大多数情况下,只有在传递具有空格的参数时才使用引号,如:
mkdir "My Documents"
创建一个名为My Documents的目录。此外,你可以逃避这样的空间。
mkdir My\ Documents
但请记住," $"是一个特殊的角色,如" \"。它被shell解释为变量。 " $一个"在执行之前将被其值替换。如果你使用简单的引用(' $ a')它将不会被shell解释。
此外,"&"是一个在后台执行命令的特殊字符。你应该把它放在引号之外。