Questions tagged «bash»

与其他Bourne / POSIX shell相对,GNU的Bourne Again SHell特有的问题。对于一般关于Unix shell的问题,请改用/ shell标记。

2
如果在dmesg中发现某些内容,如何创建一个无限循环来杀死进程?
我需要创建一个while循环,如果dmesg返回某个/任何值,那么它将终止已确定的进程。 这就是我所拥有的。 #!/bin/bash while [ 1 ]; do BUG=$(dmesg | grep "BUG: workqueue lockup" &> /dev/null) if [ ! -z "$BUG" ]; then killall someprocessname else break fi done 我不知道该! -z不该做[ test -n "$BUG" ] 我认为使用-n表示期望二进制。 我不知道该脚本是否还能工作,因为BUG锁定会中止每个进程,但是dmesg在计算机完全崩溃之前,仍然有几行内容-也许我可以追赶并杀死该进程。
8 linux  bash  scripting 

1
Bash:重定向到文件,始终创建新的
在bash中,一个命令链接 echo test > actual.txt 将actual.txt用“ test” 替换被调用文件的内容,并创建一个不存在的文件。但是,如果文件确实存在,bash只会打开它,截断它,然后将新内容写入文件。 具体来说,在这种情况下redirect命令失败: ln -s /some/illegal/path link.txt echo test > link.txt Bash 4.4.12给了我令人困惑的错误消息link.txt: No such file or directory。 避免这种情况的一种方法是确保在运行重定向命令之前删除文件。 rm link.txt && echo test > link.txt 不过,我想知道是否有一些bash选项或重定向操作符的调整可以防止这种故障模式。有任何想法吗?

4
如何在bash中移动数组值
我们要构建6个挂载点文件夹作为示例 /data/sdb /data/sdc /data/sdd /data/sde /data/sdf /data/sdg 所以我们使用数组编写了这个简单的bash脚本 folder_mount_point_list="sdb sdc sdd sde sdf sdg" folderArray=( $folder_mount_point_list ) counter=0 for i in disk1 disk2 disk3 disk4 disk4 disk5 disk6 do folder_name=${folderArray[counter]} mkdir /data/$folder_name let counter=$counter+1 done 现在我们要更改不带计数器的代码,并让= $ counter = counter + 1 是否有可能转移每个循环数组以获得下一个数组值? 像 ${folderArray[++]}

2
ls忽略“没有匹配项”
我想列出的所有文件的文件夹,名为中foldername有扩展test,atest或btest。 我立即想到要跑步 ls ./foldername/*.{a,b,}test 除非扩展名没有任何内容,否则此方法工作正常atest,在这种情况下,我会收到错误消息zsh: no matches found: ./foldername/*.atest。 有什么方法可以简单地忽略此错误并打印确实存在的文件? 我需要在ZSH和BASH中都可以使用。

1
为什么以存储的嵌套命令返回码退出会导致Dash和Bash中的返回码不同?
跑步 bash -c 'bash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;' 根据我的理解,这导致将结果test1打印到控制台并echo $?进行打印1,因为命令应该返回内部[b/d]ash -c返回的内容,而 dash -c 'dash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;' 结果相同,但0根据则返回echo $?。 我想了解这种差异,以便加深对Shell和可移植Shell编程的了解。 我在Ubuntu 17.10(Artful Aardvark)上使用bash4.4.12和dash0.5.8-2.3ubuntu1。

1
用种子重击随机?
我一直在使用$((1 + RANDOM % 1000))生成一个随机数。 是否可以做类似的事情但提供种子? 这样,给定相同的种子,总是会输出相同的随机数吗?
8 bash  random 

4
使用IFS分割字串
我已经编写了一个示例脚本来拆分字符串,但是无法正常工作 #!/bin/bash IN="One-XX-X-17.0.0" IFS='-' read -r -a ADDR <<< "$IN" for i in "${ADDR[@]}"; do echo "Element:$i" done #split 17.0.0 into NUM IFS='.' read -a array <<<${ADDR[3]}; for element in "${array[@]}" do echo "Num:$element" done 输出 One XX X 17.0.0 17 0 0 但我希望输出为: One XX X 17.0.0 17 0 …

8
按文件的基本名称对文件的路径名数组进行排序
假设我有存储在数组中的文件的路径名列表 filearray=("dir1/0010.pdf" "dir2/0003.pdf" "dir3/0040.pdf" ) 我想根据文件名的基本名称以数字顺序对数组中的元素进行排序 sortedfilearray=("dir2/0003.pdf" "dir1/0010.pdf" "dir3/0040.pdf") 我怎样才能做到这一点? 我只能对它们的基本名称部分进行排序: basenames=() for file in "${filearray[@]}" do filename=${file##*/} basenames+=(${filename%.*}) done sortedbasenamearr=($(printf '%s\n' "${basenames[@]}" | sort -n)) 我在想 创建一个关联数组,其键是基名,值是路径名,因此对路径名的访问总是通过基名完成的。 仅为基名创建另一个数组,然后将其应用于基sort名数组。 谢谢。
8 bash  filenames  sort  array 

3
从另一个数组引用bash数组变量
我想编写一个脚本来引用另一个包含这些数组变量名的数组。 到目前为止,这是我的代码: #!/bin/bash array1=('array1string1' 'array1string2') array2=('array2string1' 'array2string2') array_names=('array1' 'array2') for a in ${array_names[@]} do for b in ${a[@]} do echo $b done done 我希望输出扫描这两个数组(从外部for循环)并在内部for循环中打印相应的字符串,从而调用echo。我当前的输出只是向我显示: array1 array2 对此,我将不胜感激。谢谢!

5
使用排序将文件名中的单词按字母顺序排序?
在阅读有关bash中的批量重命名文件的教程并使用sort命令对文件内容进行排序时,我还无法弄清楚如何将两者结合起来。 我有一个目录,该目录的内容使用文件名中的标签进行排序,类似于TagSpaces程序处理事物的方式。创建或下载文件名时,我会在文件名的末尾添加任何我能想到的标签。这是一个例子: Sunrise (2) #wallpaper #4k #googleimages.jpg 现在,我想浏览所有这些文件并重命名它们,以便标签按字母顺序排序,而不会影响标签之前或之后的任何内容(例如,图片的标题或文件扩展名)。因此,以上内容将变为: Sunrise (2) #4k #googleimages #wallpaper.jpg 我该如何完成?我什至不知道如何将文件名而不是其内容传递给类似的命令sort,然后可以将其输出传递给mv。
8 bash  rename  sort 

1
在bash中创建我自己的cp函数
对于一项作业,我被要求巧妙地编写一个bash函数,该函数具有与该函数cp(副本)相同的基本功能。它仅需将一个文件复制到另一个文件,因此无需将多个文件复制到新目录。 由于我是bash语言的新手,所以我不明白为什么我的程序无法正常工作。原始功能要求覆盖文件(如果已存在),因此我尝试实现该功能。它失败。 该文件似乎在多行上失败了,但最重要的是,在这种情况下,它检查了要复制到的文件是否已经存在([-e "$2"])。即使这样,它仍然显示如果满足该条件则应该触发的消息(文件名...)。 谁能帮助我修复此文件,从而可能对我的基本语言理解有所帮助?代码如下。 #!/bin/sh echo "file variable: $2" if [-e file]&> /dev/null then echo "The file name already exists, want to overwrite? (yes/no)" read | tr "[A-Z]" "[a-z]" if [$REPLY -eq "yes"] ; then rm "$2" echo $2 > "$2" exit 0 else exit 1 fi else cat …


3
在shell脚本中添加极大的数字
假设两个数字存储在两个不同的文件中,a.txt并且b.txt。 每个数字都足够大(超过30个数字),而所使用的数字数据类型不支持该数字bash。 如何在外壳中添加它们?

1
猛击不如预期
这是一个作业问题: 将所有文件名与2个或多个以小写字母开头但不以大写字母结尾的字符匹配。 我不明白为什么我的解决方案无法正常工作。 所以我执行了以下内容: touch aa touch ha touch ah touch hh touch a123e touch hX touch Ax ls [a-z]*[!A-Z] 输出: aa ha 我的问题:为什么不匹配“ ah”,“ hh”或“ a123e”?

3
将stdout和stderr发送到文件,系统日志和终端
对于正在启动的某些云计算机,我试图登录到特定文件,系统日志和终端/控制台。 在机器设置/ cloud-init脚本的顶部,我有以下内容: #!/bin/bash exec &> >(tee "/tmp/box-setup.log" | logger -t box-setup) apt-get install -y some-package 这在将输出发送到文件和syslog时非常有用,但不会通过管道将输出发送到终端。 一般而言,除了从远程控制台进行调试之外,没有终端输出不是一个大问题。发生这种情况时,我完全是盲目的,因为执行bash脚本时控制台是空白的。 是否有一种简单的方法使用bash重定向或其他方法将所有输出(标准输出以及标准错误)同时传输到文件,syslog和终端? 我正在运行Ubuntu 16.04。

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.