相关疑难解决方法(0)

处理除第一个之外的所有参数(在bash脚本中)

我有一个简单的脚本,其中第一个参数是为文件名保留的,所有其他可选参数应该传递给脚本的其他部分.

使用Google我发现了这个wiki,但它提供了一个文字示例:

echo "${@: -1}"
Run Code Online (Sandbox Code Playgroud)

我无法得到任何其他工作,例如:

echo "${@:2}"
Run Code Online (Sandbox Code Playgroud)

要么

echo "${@:2,1}"
Run Code Online (Sandbox Code Playgroud)

我从终端得到"坏替换".

问题是什么,除了传递给bash脚本的第一个参数外,我该如何处理?

bash shell

401
推荐指数
3
解决办法
15万
查看次数

Bash延续线

你如何使用bash延续线?

我意识到你可以这样做:

echo "continuation \
lines"
>continuation lines
Run Code Online (Sandbox Code Playgroud)

但是,如果你有缩进代码,它不能很好地工作:

    echo "continuation \
    lines"
>continuation     lines
Run Code Online (Sandbox Code Playgroud)

bash indentation line

143
推荐指数
4
解决办法
15万
查看次数

66
推荐指数
6
解决办法
8万
查看次数

UNIX中的$ @和$*有什么区别?

UNIX $@$*UNIX 之间的区别是什么?当在脚本中回显时,它们似乎都产生相同的输出.

unix variables shell

15
推荐指数
2
解决办法
1万
查看次数

Bash自动完成 - 如何将此数组传递给compgen而不会丢失重要的空格?

以下bash完成将一系列可能的单词(即完成)传递给compgen.

basenames=("foo" "fu bar" "baz");

COMPREPLY=($(compgen -W "${basenames[*]}" -- "${COMP_WORDS[COMP_CWORD]}"))
Run Code Online (Sandbox Code Playgroud)

问题是数组元素中的空格不会被保留,即"foo bar"被视为元素,这要归功于单词拆分.有没有办法保留空白,所以显示3个元素,而不是4?

编辑

basenames 包含文件名,几乎每个字符(除了/和\ 0)都是允许的.

编辑2

-W标志需要一个单词,就像这样foo bar foobar.传递多个元素(这是${basenames[@]}可以做的)是行不通的.

编辑3

更改了示例性的basenames数组(因此foofoofrom foo bar不会折叠).

使用换行符分隔单词的工作原理:

local IFS=$'\n'
COMPREPLY=($(compgen -W "$(printf "%s\n" "${basenames[@]}")" --  ${COMP_WORDS[COMP_CWORD]}"))
Run Code Online (Sandbox Code Playgroud)

使用\0不:

local IFS=$'\0'
COMPREPLY=($(compgen -W "$(printf "%s\0" "${basenames[@]}")" --  ${COMP_WORDS[COMP_CWORD]}"))
Run Code Online (Sandbox Code Playgroud)

arrays bash bash-completion

12
推荐指数
1
解决办法
3986
查看次数

标签 统计

bash ×4

shell ×3

arrays ×2

bash-completion ×1

indentation ×1

line ×1

unix ×1

variables ×1