Questions tagged «shell-script»

有关shell脚本,由shell解释的可执行文件(bash,zsh等)的问题。


1
在Bash中,是否[-z“ $ 1”]和[[$ 1” =“””是否相同?
在Bash Shell脚本中,以下两个语句之间有什么区别(如果有)? 1.) if [ -z "$1" ] 2.) if [ "$1" = "" ] 我发现自己在某些脚本中编写了第二本,但是随后我在这里读到,使用-z可以达到相同的目的。 如果在使用第二个方法时遇到问题,我们是否应该忽略第一个方法看起来更好一些?

9
对于Bash中的vs查找
遍历文件时,有两种方法: 使用for-loop: for f in *; do echo "$f" done 用途find: find * -prune | while read f; do echo "$f" done 假设这两个循环将找到相同的文件列表,那么这两个选项在性能和处理方面有何不同?

7
将下划线转换为PascalCase,即UpperCamelCase
如果我有一个看起来像这样的字符串: "this_is_the_string" 在bash脚本中,我想将其转换为PascalCase,即UpperCamelCase看起来像这样: "ThisIsTheString" 我发现可以这样转换为lowerCamelCase: "this_is_the_string" | sed -r 's/([a-z]+)_([a-z])([a-z]+)/\1\U\2\L\3/' 不幸的是,我对正则表达式不够熟悉,无法对其进行修改。

14
Bash脚本使用FFmpeg将所有* flac转换为* .mp3?
我想将所有* .flac转换为特定文件夹中的* .mp3。 这是我尝试过的,但不起作用: # change to the home directory cd ~/music # convert all *.flac files ffmpeg -i *.flac -acodec libmp3lame *.mp3 # (optional: check whether there are any errors printed on the terminal) sleep 60 如何达到目标?


5
使用sed(或awk)删除图案上方的行范围
我有以下代码,该代码将删除带有模式的banana行及其后的两行: sed '/banana/I,+2 d' file 到目前为止,一切都很好!但我需要它来除去2行之前 banana,但我不能用“减号”或任何(类似于得到它grep -v -B2 banana file应该做的,但没有): teresaejunior@localhost ~ > LC_ALL=C sed '-2,/banana/I d' file sed: invalid option -- '2' teresaejunior@localhost ~ > LC_ALL=C sed '/banana/I,-2 d' file sed: -e expression #1, char 16: unexpected `,' teresaejunior@localhost ~ > LC_ALL=C sed '/banana/I,2- d' file sed: -e …

4
测试shell脚本中变量是否为空
我已经看到以下技术在许多不同的shell上多次使用,以测试变量是否为空: if [ "x$1" = "x" ]; then # Variable is empty fi 与更规范的用法相比,使用此方法有什么好处if [ -z "$1" ]吗?可能是可移植性问题吗?



5
从shell提示接受'Yes'变体的更好方法
我编写的Shell脚本的可用性测试发现,人们对如何回答以“是”为答案的问题抱有不同的期望。请参见下面的代码示例中的变体。 当然,必须有一种更好的方法来解决我的问题?您对此的可读性和简短形式是什么? read -p 'Answer this question with yes: ' answer if [ "$answer" = 'Y' -o "$answer" = 'YES' -o "$answer" = 'Yes' -o "$answer" = 'y' -o "$answer" = 'yes' -o some-alternate-condition ]; then echo 'Surely this can be written better?' fi

3
“ while:;”是什么意思?
我知道什么是while循环。但是,我只看到它适用于: while [condition] while ![condition] while TRUE (infinite loop) 之后的陈述while必须为TRUE或FALSE。 有一个名为shell的内置命令:。它被描述为不执行任何操作的虚拟命令,但是我不知道这里是否相同,即使它可以是TRUE还是FALSE。也许有些不同,但是呢?



2
使用`set -eu`时正确的EXIT和ERR陷阱行为
与ERR和EXIT陷阱一起使用set -e(errexit),set -u(nounset)时,我观察到一些奇怪的行为。它们似乎相关,因此将它们放在一个问题中似乎是合理的。 1)set -u不触发ERR陷阱 码: #!/bin/bash trap 'echo "ERR (rc: $?)"' ERR set -u echo ${UNSET_VAR} 预期:ERR陷阱被调用,RC!= 0 实际:未调用ERR陷阱,RC == 1 注意:set -e不改变结果 2)set -eu在EXIT陷阱中使用退出代码是0而不是1 码: #!/bin/bash trap 'echo "EXIT (rc: $?)"' EXIT set -eu echo ${UNSET_VAR} 预期:调用EXIT陷阱,RC == 1 实际:调用EXIT陷阱,RC == 0 注意:使用时set +e,RC ==1。当任何其他命令引发错误时,EXIT陷阱将返回正确的RC。 编辑:关于该主题的一篇SO帖子带有一个有趣的注释,表明这可能与所使用的Bash版本有关。使用Bash 4.3.11测试此代码段会导致RC = …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.