Questions tagged «shell-script»

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

6
如何移动前x个文件
我有一个包含数千个无序文件的巨大文件夹。通过mv命令将前5000个移动到子文件夹是否可行?现在我用 mv *some_pattern* ./subfolder1/ 到目前为止,我非常随机地移动图像,如果每个子文件夹中没有完全5000个文件,这并不重要。有更好的方法吗?


1
为什么“#!/ bin / sh -a”中的-a影响sed而“ set -a”却不影响?
如果我运行以下.sh文件: #!/bin/sh -a echo "a" | sed -e 's/[\d001-\d008]//g' 结果是一个错误: sed:-e表达式#1,字符18:无效的范围结尾 但是,如果我运行以下.sh文件: #!/bin/sh set -a echo "a" | sed -e 's/[\d001-\d008]//g' 它运行没有错误。第二个代码不是应该等同于第一个吗?为什么在第一个错误?

5
如何根据另一个变量简洁地为变量分配不同的值?
我如何缩短这个shell脚本? CODE="A" if test "$CODE" = "A" then PN="com.tencent.ig" elif test "$CODE" = "a" then PN="com.tencent.ig" elif test "$CODE" = "B" then PN="com.vng.pubgmobile" elif test "$CODE" = "b" then PN="com.vng.pubgmobile" elif test "$CODE" = "C" then PN="com.pubg.krmobile" elif test "$CODE" = "c" then PN="com.pubg.krmobile" elif test "$CODE" = "D" then …

1
POSIX在命令替换内对此处引用的文档有何要求?
在此问题中,有人报告了一个使用here文档的问题,该文档在$(...)命令替换中使用带引号的定界符单词,其中\文档内部行末尾的反斜杠触发换行-换行,而在命令替换之外的相同here文档可以按预期工作。 这是一个简化的示例文档: cat <<'EOT' abc ` def ghi \ jkl EOT 这包括在行尾包含一个反引号和一个反斜杠。用引号引起来,因此主体内部不会发生扩展。在所有与伯恩相似的地方,我都能找到逐字逐句输出的内容。如果我将相同文档放在命令替换中,如下所示: x=$(cat <<'EOT' abc ` def ghi \ jkl EOT ) echo "$x" 然后它们不再表现相同: dash,ash,zsh,ksh93,BusyBox的ash,mksh,和SunOS 5.10 POSIX sh都给予该文件的逐字内容,如前。 Bash 3.2针对不匹配的反引号给出了语法错误。使用匹配的反引号,它尝试将内容作为命令运行。 Bash 4.3将“ ghi”和“ jkl”折叠到一行上,但是没有错误。该--posix选项不影响此。Kusalananda 告诉我(谢谢!)的pdksh行为也是如此。 在最初的问题中,我说这是Bash解析器中的错误。是吗?[更新:是 ]我可以从POSIX(全部来自Shell命令语言定义)中找到相关文本: §2.6.3命令替换: 使用$(command)格式,在右括号后到匹配的右括号后的所有字符构成命令。可以将任何有效的Shell脚本用于命令,但仅由重定向组成的脚本会产生未指定的结果。 §2.7.4此处文档: 如果对单词的任何部分加引号,则应通过对单词执行引号删除来形成定界符,并且此处文档行不得扩展。 第2.2.1节转义符(反斜杠): 如果<newline>跟在<backslash>之后,则外壳程序应将其解释为行继续。在将输入拆分为令牌之前,应删除<backslash>和<newline>。 §2.3令牌识别: 当io_here标记已被语法识别时(请参见Shell Grammar),紧接在下一个NEWLINE标记之后的一个或多个后续行构成一个或多个here-document的主体,并应根据Here-rule的规则进行解析-文件。 当不处理io_here时,外壳程序应通过将下面的第一个适用规则应用于其输入中的下一个字符,将其输入分解为令牌。... ... 如果当前字符是<反斜杠>,单引号或双引号,并且未加引号,则它将影响到后续字符的引号,直到引号文本的末尾。对引用的规则中所描述的引用。在令牌识别期间,不得实际执行任何替换,并且结果令牌应完全包含输入中出现的字符(<newline>联接除外),且未修改,包括在末尾之间的任何嵌入式或封闭引号或替换运算符。引用文字的内容。 …

3
如何非侵入性地测试对文件的写访问权限?
在Shell脚本中,如何在不实际尝试修改文件的情况下轻松地且非侵入性地测试对文件的写访问权限? 我可以解析的输出stat,但这看起来确实很复杂,并且可能很脆弱,尽管我不确定实现和时间之间的统计输出有多少不同。 我可以附加到文件的末尾,看看是否成功,但这有潜在的危险,原因有两个: 我现在必须删除添加项,并且如果其他进程将文件写入文件,由于我的行不再是最后一行,因此这立即变得很简单。 任何读取文件的过程可能对该文件的内容有任意要求,而我可能只是破坏了该应用程序。

4
我如何等待在另一个Shell中启动的程序
我有一个程序,它需要做大量的工作(大约需要4-5个小时),当它可以使用的所有数据都可用时,它就会由cron启动。有时,当我等待它完成时,我希望能够在完成时启动另一个(交互式)程序。等待电话看起来很有希望,但只会等待孩子。


5
有没有一种方法可以汇总列出的文件大小?
这是我用来列出一些文件的命令: find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \; -rw-r--r-- 1 qa1wrk15 test 1265190 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_7.20110929.extract.sys -rw-r--r-- 1 qa1wrk15 test 1345554 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_2.20110929.extract.sys -rw-r--r-- 1 qa1wrk15 test 1370532 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_3.20110929.extract.sys -rw-r--r-- 1 qa1wrk15 test 1399854 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_8.20110929.extract.sys 等等。 现在,我想通过累加第5列来计算这些文件的总大小。我想到要使用awk来执行此操作,因此我在特定目录中测试了以下内容 …


1
语法错误:文件意外结束-Bash脚本[关闭]
已关闭。这个问题需要细节或说明。它当前不接受答案。 想改善这个问题吗?添加详细信息并通过编辑此帖子来澄清问题。 4年前关闭。 我正在尝试创建一个spritz应用程序。一切正常,但是从昨天开始我一直收到此错误: ./spritz:第176行:语法错误:文件意外结束 我已经检查了脚本文件,一切似乎都很完美。我很困惑,我最后有一个if语句,它看起来正确!这是最后一部分: #checks if speed is 150 157 if [[ $2 -eq 150 ]]; 158 then 159 starttime=$SECONDS 160 FS=$'\n' 161 for j in `grep --color=always -iP '\b[^aeiou\s]*[aeiou][^aeiou\s]*\K[aeiou]' $1`; 162 do 163 #Reads the text file in the centre of the screen 164 echo " ___________________" …

6
生成一致的机器唯一ID
我们能否为每台PC生成唯一的ID,例如uuuidgen,但是除非进行硬件更改,否则它永远不会改变?我当时正在考虑合并CPUID和MACADDR并对其进行哈希处理以生成一致的ID,但是我不知道如何使用bash脚本解析它们,我知道如何从中获取CPUID dmidecode -t 4 | grep ID 和 ifconfig | grep ether 那么我需要组合这些十六进制字符串,并使用sha1或md5对其进行散列以创建固定长度的十六进制字符串。 如何解析该输出?

4
将长输出分成两列
是否有一个简单的实用程序或脚本来对我的一个脚本的输出进行列化?我有某种形式的数据: A aldkhasdfljhaf B klajsdfhalsdfh C salkjsdjkladdag D lseuiorlhisnflkc E sdjklfhnslkdfhn F kjhnakjshddnaskjdh 但是如果这变成两个长,则以以下形式写入数据(仍然按垂直顺序排列): A aldkhasdfljhaf D lseuiorlhisnflkc B klajsdfhalsdfh E sdjklfhnslkdfhn C salkjsdjkladdag F kjhnakjshddnaskjdh 通过阅读手册页,我认为这column不适合,但我不确定。拆分表格很容易: A B C D E F 通过仅\n每隔两行打印一次(我当前脚本执行的操作)。有任何想法吗?谢谢!

3
将shell脚本作为守护程序运行的“正确”方法
我正在编写一个shell脚本,希望在启动时作为守护程序运行,而无需使用daemontools或daemonize之类的外部工具。 Linux守护程序编写方法 根据Linux Daemon Writing HOWTO的规定,适当的守护程序具有以下特征: 来自父进程的分叉 关闭所有文件描述符(即stdin,stdout,stderr) 打开写入日志(如果已配置) 将工作目录更改为永久目录(通常为/) 重置文件模式掩码(umask) 创建一个唯一的会话ID(SID) 守护简介 该守护进程介绍更进一步,指出一个典型的守护程序也: 从其控制终端取消关联(如果有),并忽略所有终端信号 从其流程组中脱离 处理 SIGCLD 我将如何做到这一切的sh,dash或bash只用普通的Linux工具脚本? 尽管Debian是我们的主要重点,但该脚本应该能够在尽可能多的发行版上运行而无需其他软件。 注意:我知道在StackExchange网络上有很多建议使用nohup或的答案setsid,但是这些方法都不能满足上述所有要求。 编辑:该守护进程(7)用户手册还给出了一些三分球,虽然似乎有老式的之间的一些差异SysV守护程序和更新systemd的。由于与各种发行版的兼容性很重要,因此请确保答案清楚说明所有差异。

4
dirname和basename与参数扩展
是否有客观原因偏爱一种形式?性能,可靠性,可移植性? filename=/some/long/path/to/a_file parentdir_v1="${filename%/*}" parentdir_v2="$(dirname "$filename")" basename_v1="${filename##*/}" basename_v2="$(basename "$filename")" echo "$parentdir_v1" echo "$parentdir_v2" echo "$basename_v1" echo "$basename_v2" 产生: /some/long/path/to /some/long/path/to a_file a_file (v1使用外壳程序参数扩展,v2使用外部二进制文件。)

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.