我正在尝试编写一个返回由两部分组成的字符串的函数:
- 选择开关
- 带有空格的文件名。
我的问题是:如何引用以将结果传递给另一个程序?
#!/bin/bash
getOption() {
echo "-C $1"
}
# prints first lines of man page of cp (copy)
man $(getOption "$1") cp | head -10
在此示例中,我尝试将自定义配置文件传递给man
。假设上面的代码片段名为run.sh
,自定义配置名为my man.conf
,并且两者都位于同一目录中,则会出现此错误:
$ ./run.sh "my man.conf"
my: No such file or directory
Warning: cannot open configuration file my
# output from man for man…
作为格伦·杰克曼指出:我错过了一点Bash 的文档
上述问题的根源在于您需要一种方法来将每个参数保留为单独的单词,即使该参数包含空格。引号无法做到这一点,但数组可以。
因此更新时会保留空格
#!/bin/bash
args=("")
addOption() {
args+=(-C "$1")
return 0
}
$(addOption "$1")
man "${args[@]}" cp | head -10
答案1
基本上,你需要重构。即使从函数中传回引号也行不通。这
getOption() {
echo "-C '$1'"
}
只会导致错误消息cannot open configuration file 'my
一旦将包含空格的字符串连接到另一个字符串,就无法将添加的字符串提取为单个实体。
考虑到你的问题,你应该这样做
man -C "$1" ...
但我怀疑您希望“run.sh”比您展示的更复杂。请提供更多详细信息。
答案2
您没有引用,您需要在命令行上转义空格,例如:
./run.sh my\ man.conf
在大多数 shell 中,制表符补全可以帮助您完成此操作。
当然,文件和目录名中的空格是有点邪恶的,真正的解决办法是尽量避免这些。
附言:我认为您的脚本除了获取正确的参数之外还存在其他问题……