Questions tagged «bash»

有关为Bash命令外壳编写的脚本的问题。对于具有错误/语法错误的shell脚本,请在此处发布之前,使用shellcheck程序(或在Web shellcheck服务器中的https://shellcheck.net)进行检查。有关Bash交互使用的问题更可能是Super User而不是Stack Overflow上的话题。

2
在bash完成的背景下,关于$ {array [*]}与$ {array [@]}的混淆
我第一次尝试编写bash补全,这让我有些困惑,因为这两种取消引用bash数组(${array[@]}和${array[*]})的方式都令人困惑。 这是相关的代码块(顺便说一句,它可以工作,但是我想更好地理解它): _switch() { local cur perls local ROOT=${PERLBREW_ROOT:-$HOME/perl5/perlbrew} COMPREPLY=() cur=${COMP_WORDS[COMP_CWORD]} perls=($ROOT/perls/perl-*) # remove all but the final part of the name perls=(${perls[*]##*/}) COMPREPLY=( $( compgen -W "${perls[*]} /usr/bin/perl" -- ${cur} ) ) } bash的文档说: 数组的任何元素都可以使用$ {name [subscript]}进行引用。需要使用花括号来避免与Shell的文件名扩展运算符冲突。如果下标为'@'或'*',则单词将扩展为数组名称的所有成员。仅当单词出现在双引号中时,这些下标才不同。如果单词用双引号引起来,则$ {name [*]}扩展为单个单词,每个数组成员的值均由IFS变量的第一个字符分隔,而$ {name [@]}扩展每个name元素换一个词。 现在,我想我知道应该compgen -W期望一个包含可能的替代词列表的字符串,但是在这种情况下,我不理解“ $ {name [@]}将名称的每个元素扩展为一个单独的词”的含义。 长话短说:${array[*]}作品;${array[@]}没有。我想知道为什么,并且我想更好地理解将要${array[@]}扩展的内容。

7
我应该以什么顺序向正常关闭进程发送信号?
在评论对这个答案的另一个问题,该评论说: 除非绝对必要,否则不要使用kill -9!SIGKILL无法被捕获,因此被终止的程序无法运行任何关闭例程来删除临时文件。首先尝试HUP(1),然后尝试INT(2),然后尝试QUIT(3) 我原则上同意SIGKILL,但是其余对我来说就是新闻。鉴于发送的默认信号kill是SIGTERM,我希望它是正常关闭任意进程的最普遍期望的信号。另外,我还看到了SIGHUP出于非终止原因使用的原因,例如告诉守护程序“重新读取配置文件”。在我看来,SIGINT(通常与Ctrl-C相同的中断,对吗?)并没有得到应有的广泛支持,或者以不合时宜的方式终止。 鉴于这SIGKILL是万不得已的方法,您应该以哪种信号以及以什么顺序发送到任意进程,以便尽可能地正常关闭它? 如果可以的话,请用支持性的事实(超越个人喜好或意见)或参考来证实您的答案。 注意:我对包括考虑bash / Cygwin在内的最佳实践特别感兴趣。 编辑:到目前为止,似乎没有人提到INT或QUIT,并且很少提及HUP。是否有任何理由将它们包括在有序的过程中?

3
如何在循环时将输入传递给Bash并在循环结束后保留​​变量
Bash允许使用: cat <(echo "$FILECONTENT") Bash还允许使用: while read i; do echo $i; done </etc/passwd 可以结合使用前两个: echo $FILECONTENT | while read i; do echo $i; done 最后一个问题是它创建了子外壳,而while循环结束后的变量i无法再访问。 我的问题是: 如何实现这样的目标:while read i; do echo $i; done <(echo "$FILECONTENT")换句话说:如何确定iwhile循环中是否还存在? 请注意,我知道将while语句包含在其中,{}但这不能解决问题(假设您要在函数中使用while循环并返回i变量)
87 bash  while-loop  stdin  pipe 


3
如何在Bash case语句中测试空字符串?
我有一个Bash脚本,该脚本根据变量的值执行操作。case语句的一般语法为: case ${command} in start) do_start ;; stop) do_stop ;; config) do_config ;; *) do_help ;; esac 如果没有提供命令,并且do_help命令无法识别,我想执行默认例程。我试图这样省略大小写值: case ${command} in ) do_default ;; ... *) do_help ;; esac 我认为结果是可预测的: syntax error near unexpected token `)' 然后我尝试使用正则表达式: case ${command} in ^$) do_default ;; ... *) do_help ;; esac 这样,一个空洞便${command}落到了*箱子上。 我在尝试做不可能的事吗?
87 string  bash  null  case 

7
bash-如何将结果从哪个命令传递到cd
如何将which命令的结果传递给cd? 这就是我想要做的: which oracle | cd cd < which oracle 但是它们都不起作用。 有没有办法做到这一点(当然不是复制/粘贴)? 编辑:再三考虑,此命令将失败,因为目标文件不是文件夹/目录。 因此,我正在考虑并找到一种更好的方法来摆脱尾随的“ / oracle”部分(sed或awk,甚至是Perl):) 编辑:好的,这就是我最后得到的: cd `which oracle | sed 's/\/oracle//g'`
87 linux  bash  shell  cd 

12
使用sed批量重命名文件
目的 更改这些文件名: F00001-0708-RG-biasliuyda F00001-0708-CS-akgdlaul F00001-0708-VF-hioulgigl 这些文件名: F0001-0708-RG-biasliuyda F0001-0708-CS-akgdlaul F0001-0708-VF-hioulgigl 壳牌代码 去测试: ls F00001-0708-*|sed 's/\(.\).\(.*\)/mv & \1\2/' 去表演: ls F00001-0708-*|sed 's/\(.\).\(.*\)/mv & \1\2/' | sh 我的问题 我不了解sed代码。我了解替代命令 $ sed 's/something/mv' 手段。而且我对正则表达式有所了解。但是我不明白这里发生了什么: \(.\).\(.*\) 或在这里: & \1\2/ 在我看来,前者的意思是:“一个字符,然后是一个字符,然后是一个字符的任何长度序列”,但是肯定有更多的东西。至于后面的部分: & \1\2/ 我不知道。
87 bash  shell  sed  file-rename 

13
如何在Swift脚本中运行终端命令?(例如xcodebuild)
我想用swift替换我的CI bash脚本。我不知道如何调用普通的终端命令,例如ls或xcodebuild #!/usr/bin/env xcrun swift import Foundation // Works println("Test") // Works ls // Fails xcodebuild -workspace myApp.xcworkspace // Fails $ ./script.swift ./script.swift:5:1: error: use of unresolved identifier 'ls' ls // Fails ^ ... etc ....
87 swift  bash  shell  xcodebuild 

10
使用星号登录grep
我正在尝试在linux / bash中的特定文件中搜索子字符串“ abc” 所以我做: grep '*abc*' myFile 它什么也不返回。 但是,如果我这样做: grep 'abc' myFile 它正确返回匹配项。 现在,这对我来说不是问题。但是,如果我想grep输入更复杂的字符串怎么办? *abc * def * 我将如何使用grep完成它?
87 regex  bash  grep 

4
我的环境变量是什么?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow的主题。 7年前关闭。 改善这个问题 我想在bash中找出我的环境变量。他们存放在某个地方吗?
86 linux  bash  shell  ubuntu 

16
具有最大进程数的并行Bash脚本
可以说我在Bash中有一个循环: for foo in `some-command` do do-something $foo done do-something是CPU绑定,我有一个漂亮的闪亮4核处理器。我希望能够一次运行最多4个do-something。 天真的方法似乎是: for foo in `some-command` do do-something $foo & done 这将一次执行所有操作 do-something,但是有一些缺点,主要是做某事可能还会有一些重要的I / O,一次执行所有操作可能会降低速度。另一个问题是该代码块立即返回,因此当所有do-somethings完成时,无法进行其他工作。 您将如何编写此循环,以便总是同时do-something运行X ?
86 bash 

6
为什么sudo cat给出了拒绝权限,但sudo vim正常工作?
我正在尝试在我的arch的pacman.conf文件中自动添加存储库源,但是要echo在shell脚本中使用该命令。但是,它失败是这样的: sudo echo "[archlinuxfr]" >> /etc/pacman.conf sudo echo "Server = http://repo.archlinux.fr/\$arch" >> /etc/pacman.conf sudo echo " " >> /etc/pacman.conf -bash: /etc/pacman.conf: Permission denied 如果我使用vim手动更改/etc/pacman.conf, sudo vim /etc/pacman.conf 并使用退出vim :wq,一切正常,我的pacman.conf已手动更新,没有“权限被拒绝”的投诉。 为什么会这样呢?我该如何sudo echo上班?(顺便说一句,我也尝试过使用,sudo cat但由于权限被拒绝也失败了)
86 bash  shell  echo  cat 

10
如何更新zip存档中的一个文件
是否可以在不解压缩的情况下替换zip文件中的文件而删除旧文件,添加新文件并重新压缩回来? 原因是我有一个zip文件,该文件确实很大,有时我必须更新该zip文件中的一个xml。解压缩并重新压缩需要很长时间。因此,我只想通过一个脚本替换zip中的一个xml。我已经拥有检查我所拥有的xml更新的功能。 那么是否可以仅替换一个xml而无需解压缩和重新压缩呢? 抱歉,我会使用zip命令来执行类似操作,但问题是该脚本实际上是用于android手机的,而zip不是命令,我可以使用,很遗憾,我将其遗漏了。如果可以的话,我肯定会使用zip,但我只为droid解压缩,然后在busybox中有tar,但是tar无法满足我的需求
86 bash  shell  zip 

6
从Bash中的文本文件创建数组
脚本采用一个URL,将其解析为必填字段,然后重定向其输出以保存在文件中, file.txt中。每次找到字段时,输出将保存在新行中。 file.txt A Cat A Dog A Mouse etc... 我要拿 file.txt在新脚本中从中创建一个数组,其中每一行都将成为数组中自己的字符串变量。到目前为止,我已经尝试过: #!/bin/bash filename=file.txt declare -a myArray myArray=(`cat "$filename"`) for (( i = 0 ; i < 9 ; i++)) do echo "Element [$i]: ${myArray[$i]}" done 当我运行此脚本时,空格导致单词被拆分,而不是被获取 所需的输出 Element [0]: A Cat Element [1]: A Dog etc... 我最终得到这个: 实际产量 Element …

3
Bash if语句中的正则表达式匹配
我在这里做错了什么? 尝试匹配任何包含空格,小写字母,大写字母或数字的字符串。特殊字符也将很好,但是我认为这需要转义某些字符。 TEST="THIS is a TEST title with some numbers 12345 and special char *&^%$#" if [[ "$TEST" =~ [^a-zA-Z0-9\ ] ]]; then BLAH; fi 显然,这仅测试上,下,数字和空格。虽然不起作用。 *更新* 我想我应该更具体一些。这是实际的实际代码行。 if [[ "$TITLE" =~ [^a-zA-Z0-9\ ] ]]; then RETURN="FAIL" && ERROR="ERROR: Title can only contain upper and lowercase letters, numbers, and spaces!"; …

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.