Questions tagged «shell-script»

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

5
如何在收到404后停止“ wget”?
如果您将括号扩展用于wget,则可以轻松获取按顺序编号的图像: $ wget 'http://www.iqandreas.com/sample-images/100-100-color/'{90..110}'.jpg' 它获取编号为第10个文件90.jpg来99.jpg就好了,但是100.jpg,向前返回404:找不到文件错误(我只有在服务器上存储100张图像)。如果您使用较大的范围,这些不存在的文件将更多地成为“问题”,例如{00..200},使用100个不存在的文件,它会增加脚本的执行时间,甚至可能会给您带来轻微的负担(或至少使人烦恼)服务器。 wget收到第一个404错误后,有什么方法可以停止吗?(或者,最好是连续两个,以防由于其他原因导致范围内文件丢失)。答案不需要使用大括号扩展;循环也很好。

5
在文件中按列表移动文件(前导空格)
我有一个包含文件名的文件。例如: /tmp/list.txt (它是每行开头的空格): /tmp/file.log /app/nir/home.txt /etc/config.cust 我想用一行将所有列出的文件移动/tmp/list.txt到/app/dest 所以应该是这样的: cat /tmp/list.txt | xargs mv /app/dest/

3
阻止自动EOF到命名管道,并在需要时发送EOF
我有一个程序,在读取给定流中的EOF时会自动退出(在以下情况下为stdin)。 现在,我想制作一个Shell脚本,该脚本创建一个命名管道并将程序的stdin连接到它。然后,脚本使用和(以及其他工具退出时自动生成EOF)多次写入管道。我面临的问题是,当第一个操作完成时,它会向管道发送EOF并退出程序。如果我使用类似的东西,那么我打算退出程序时无法发送EOF。我正在研究一种平衡的解决方案,但无济于事。 我已经找到了如何防止EOF以及如何手动发送EOF的方法,但是我无法将它们结合在一起。有什么提示吗? echocatechotail -f #!/bin/sh mkfifo P program < P & : # Run in background # < P tail -n +1 -f | program echo some stuff > P # Prevent EOF? cat more_stuff.txt > P # Prevent EOF? send_eof > P # How can I do this? …

10
使用Shell脚本从字符串中删除所有重复的单词
我有一个像 "aaa,aaa,aaa,bbb,bbb,ccc,bbb,ccc" 我想从字符串中删除重复的单词,然后输出将像 "aaa,bbb,ccc" 我尝试过此代码源 $ echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs 使用相同的值可以正常工作,但是当我提供变量值时,它也会显示所有重复的单词。 如何删除重复的值。 更新 我的问题是如果用户相同,则将所有对应的值添加到单个字符串中。我有这样的数据-> user name | colour AAA | red AAA | black BBB | red BBB | blue AAA | blue AAA | red CCC | …

4
是否可以通过Shell脚本修改yml文件?
这就是我的docker-compose.yml的样子。 nginx: container_name: 'nginx' image: 'nginx:1.11' restart: 'always' ports: - '80:80' - '443:443' volumes: - '/opt/nginx/conf.d:/etc/nginx/conf.d:ro' links: - 'anything' 现在,我需要通过shell脚本(在ubuntu服务器上)添加一些内容。我不太确定是否有可能: 将新元素添加到nginx/links(如果不存在) newthing如果不存在newthing-block,则附加块 新内容应如下所示: nginx: container_name: 'nginx' image: 'nginx:1.11' restart: 'always' ports: - '80:80' - '443:443' volumes: - '/opt/nginx/conf.d:/etc/nginx/conf.d:ro' - '/etc/letsencrypt:/etc/letsencrypt' links: - 'anything' - 'newthing' newthing: container_name: foo image: 'newthing:1.2.3' …

3
如何设置脚本在端口收到消息时执行
我想知道如何获取shell脚本以侦听某个端口(也许使用netcat?)。希望当消息发送到该端口时,脚本会记录该消息,然后运行一个函数。 例: 计算机1的脚本在后台运行,该脚本打开了端口1234以访问传入流量 计算机2将消息“ hello world”发送到计算机1的端口1234 计算机1上的脚本将消息“ hello world”记录到变量$ MESSAGE中 现在已设置变量$ MESSAGE,脚本运行功能 我该怎么做呢?

5
bash +使用printf以特殊格式打印
我刚刚编写了以下bash脚本来检查Linux机器列表上的ping访问: for M in $list do ping -q -c 1 "$M" >/dev/null if [[ $? -eq 0 ]] then echo "($C) $MACHINE CONNECTION OK" else echo "($C) $MACHINE CONNECTION FAIL" fi let C=$C+1 done 打印: (1) linux643 CONNECTION OK (2) linux72 CONNECTION OK (3) linux862 CONNECTION OK (4) linux12 CONNECTION …

2
通过外壳测试对阵列的支持
有没有一种简洁的方法可以在命令行中通过类似Bourne的本地shell测试数组支持? 这始终是可能的: $ arr=(0 1 2 3);if [ "${arr[2]}" != 2 ];then echo "No array support";fi 或测试$SHELL和shell版本: $ eval $(echo "$SHELL --version") | grep version 然后,假设我可以访问它,则阅读手册页。(即使从那里开始/bin/bash,我也假设所有类似Bourne的shell都接受long选项--version,例如,对于ksh 来说,这样做会导致中断。) 我正在寻找一个简单的测试,可以在脚本开始时甚至在调用它之前将其无人值守并纳入“ 用法”部分。

4
Bash,调用新的shell后执行命令
我正在尝试制作一个像这样的脚本: #!/bin/bash sudo -s something... 当我执行它时,我得到一个新的外壳,但是something仅当我退出由创建的外壳时才执行sudo -s,而不是在其内部执行。 有什么帮助吗?

2
如何检查rsync是否对bash进行了任何更改?
我有一个脚本,该脚本使用rsync在远程->本地方案中同步数据。运行rsync命令后,立即检查错误代码是否等于零。如果其为零,则执行其他命令。但是,这没有考虑到rsync可能已经成功运行但实际上并未进行任何更改的事实。因此,无论如何都将等于零条件运行,这有点多余。 rsync -aEivm --delete /path/to/remote/ /path/to/local/ if [ $? -eq 0 ]; then # Success do some more work! else # Something went wrong! exit 1; fi 将其扩展为检查是否确实存在基于运行的rsync命令的任何更改的最佳方法是什么。我已经读过-i标志可以将输出提供给stdout,但是如何将其放在条件块中呢?

5
查找比一天更新的文件并进行复制
我正在使用一个脚本,该脚本将仅将过去一天创建的文件复制到另一个文件夹。我遇到的问题是我复制了源目录中的所有文件的脚本,而不是仅仅复制了不到一天的文件。 这就是我所拥有的: find . -mtime -1 -exec cp --preserve --parents -a "{}" /somefolder \; 上面的代码复制源目录中的所有文件。如果我删除“ cp”的所有参数,则可以使用: find . -mtime -1 -exec cp "{}" /somefolder \; 上面的代码仅复制我想要的最新文件,但我需要使用cp参数保留属性。 我也尝试过变量,并且对于循环的思考可能是-exec选项是问题所在: files="$(find -mtime -1)" for file in "$files" do cp --parents --preserve -a file /somefolder 但是,上述for循环会导致相同的问题,所有文件都将被复制。如果我回显$ files,则仅显示我需要的文件。 我该如何工作?

3
可以同时使用大括号(排列)和数组扩展吗?
Bash的{}大括号扩展语法允许创建简单的排列 # echo {b,c,d}{a,e,i,o,u} ba be bi bo bu ca ce ci co cu da de di do du 但是我不清楚是否/如何将其与数组一起使用,除非非常笨拙地使用$() echoandeval 有没有一种简单的方法可以将数组与花括号(排列)扩展一起使用? 例如,想象一下类似的事情(这当然不起作用): CONS=( b c d ) VOWEL=( a e i o u ) echo {${CONS[@]}}{${VOWEL[@]}}


2
并行运行命令,并等待一组命令完成后再启动下一个命令
我有包含多个命令的脚本。如何将命令组合在一起运行(我想制作几组命令。在每组中,命令应并行运行(同时)。各组应顺序运行,等待一组完成后再开始运行。下一组)...即 #!/bin/bash command #1 command #2 command #3 command #4 command #5 command #6 command #7 command #8 command #9 command #10 我怎样才能每三个命令运行一次?我试过了: #!/bin/bash { command #1 command #2 command #3 } & { command #4 command #5 command #6 } & { command #7 command #8 command #9 }& …

3
退出bash功能,而不是终端
我有一个bash脚本,如下所示,它可以安装zookeeper,但前提是尚未安装。 ##zookeper installZook(){ ZOOK_VERSION="3.4.5" ZOOK_TOOL="zookeeper-${ZOOK_VERSION}" ZOOK_DOWNLOAD_URL="http://www.us.apache.org/dist/zookeeper/${ZOOK_TOOL}/${ZOOK_TOOL}.tar.gz" if [ -e $DEFAULT_INSTALLATION_DEST/${ZOOK_TOOL} ]; then echo "${ZOOK_TOOL} alreay installed"; exit 1; # <<<< here elif [ ! -e $DEFAULT_SOURCE_ROOT/${ZOOK_TOOL}.tar.gz ]; then wgetIt $ZOOK_DOWNLOAD_URL else echo "[info] : $DEFAULT_SOURCE_ROOT/$ZOOK_TOOL already exists" fi sudo mkdir -p /var/lib/zookeeper sudo mkdir -p /var/log/zookeeper tarIt "$DEFAULT_SOURCE_ROOT/$ZOOK_TOOL.tar.gz" sudo chmod …

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.