我有以下脚本。这是一个简单的测试用例,其中a
是任何字符串值,并且b
应该是一条路径。
#!/bin/bash
alias jo "\
echo "please enter values "\
read a \
read -e b \
echo "My values are $a and $b""
但是,每当我尝试执行 ./sample.sh 时都会出现以下错误:
./sample.sh: line 3: alias: jo: not found
./sample.sh: line 3: alias: echo please: not found
./sample.sh: line 3: alias: enter: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: read a read -e b echo My: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: are: not found
./sample.sh: line 3: alias: and: not found
./sample.sh: line 3: alias: : not found
当我尝试时,source sample.sh
我得到了以下信息:
a: Undefined variable.
我的目的是将其设为别名,以便我可以获取此脚本并运行别名来执行命令行。有人可以看看这个并告诉我错误是什么吗?
答案1
这里有几个问题
与 不同
csh
,在 中bash
(以及其他类似 Bourne 的 shell),别名是用符号指定的,=
例如alias foo=bar
引号不能像这样嵌套;在这种情况下,你可以在别名两边使用单引号,在别名内部使用双引号
反斜杠
\
是行延续字符:从句法上讲,它使你的命令变成单身的线(与你想要的相反)
所以
#!/bin/bash
alias jo='
echo "please enter values "
read a
read -e b
echo "My values are $a and $b"'
测试:首先我们获取文件:
$ . ./myscript.sh
然后
$ jo
please enter values
foo bar
baz
My values are foo bar and baz
如果你想使用别名之内脚本,请记住别名仅在交互式 shell 中默认启用:要在脚本中启用它们,您需要添加
shopt -s expand_aliases
无论上述内容如何,您都应该考虑使用 shell 函数,而不是像这样的别名
答案2
习惯于在 POSIX 类型的 shell 中使用函数。您不会遇到任何引用问题:
jo () {
read -p "Enter value for 'a': " -e a
read -p "Enter value for 'b': " -e b
echo "My values are $a and $b"
}
答案3
只需创建一个 shell 函数并使用它:
showfiles() {
defaults write com.apple.finder AppleShowAllFiles TRUE
killall Finder }
完毕....