Questions tagged «shell-script»

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

6
shebang(脚本声明)行过多-有什么方法可以减少行数?
我有一个包含约20个小.sh文件的项目。我将这些名称命名为“小”,因为通常没有文件包含超过20行的代码。我之所以采用模块化方法,是因为我忠于Unix理念,并且对我来说维护项目更容易。 在每个.sh文件的开头,我放置了#!/bin/bash。 简而言之,我了解脚本声明有两个目的: 它们帮助用户回忆起执行该文件所需的外壳程序(例如,几年后不使用该文件)。 他们确保脚本仅在特定外壳程序(在这种情况下为Bash)下运行,以防止在使用其他外壳程序的情况下出现意外行为。 当一个项目开始从5个文件增长到20个文件或从20个文件增长到50个文件时(不是这种情况,只是为了演示),我们有20行或50 行的脚本声明。我承认,即使对某些人来说可能很有趣,但我对使用20或50而不是每个项目只说1个(也许在项目的主文件中)感到有点多余。 有没有一种方法可以通过在某些主文件中使用一些“全局”脚本声明来避免所谓的20或50或更多行的脚本声明冗余?

2
为什么我的脚本“ killl”失败了,但是重命名后却能正常工作?
有问题的脚本终止了我的本地主机端口8080上的最新进程。 #!/bin/bash x=$(lsof -i:8080 | tail -1 | awk '{print $2}') kill -9 $x 如果脚本被命名为“ killl”(得到它吗?杀死最新消息?),那是行不通的。它提示我cmdsubst> 将脚本重命名为“ asdf”,一切正常。有这种行为的解释吗?我正在使用MacOS ElCapitán。
12 shell-script  osx 

1
如何复制文件夹中的所有文件(不包括正在写入的文件)?
我downloading通过HTTPie将多个文件下载到一个文件夹中。一个bash脚本旨在处理下载的文件,我尝试将下载的文件复制到另一个文件夹 find /folder/downloading -type f -exec mv '{}' /folder/downloaded \; 但这还会复制尚未完成的文件。我试图通过添加-mmin +5到命令来限制传输到较旧的文件。什么是有效的命令以使文件被写入而仅传输下载的文件?


3
如何在不再次调用sed或awk的情况下从字符串中删除点字符?
我有一个hostlist.txt包含以下内容的文件: host1.mydomain.com host2.mydomain.com anotherhost www.mydomain.com login.mydomain.com somehost host3.mydomain.com 我有以下小脚本: #!/usr/local/bin/bash while read host; do dig +search @ns1.mydomain.com $host ALL \ | sed -n '/;; ANSWER SECTION:/{n;p;}'; done <hostlist.txt \ | gawk '{print $1","$NF}' >fqdn-ip.csv 输出到fqdn-ip.csv: host1.mydomain.com.,10.0.0.1 host2.mydomain.com.,10.0.0.2 anotherhost.internal.mydomain.com.,10.0.0.11 www.mydomain.com.,10.0.0.10 login.mydomain.com.,10.0.0.12 somehost.internal.mydomain.com.,10.0.0.13 host3.mydomain.com.,10.0.0.3 我的问题是如何删除.逗号前的内容而不进行调用sed或gawk再次调用?我可以在现有步骤中执行某些步骤,sed还是gawk可以删除点的调用? hostlist.txt 将包含数千个主机,因此我希望我的脚本快速高效。

4
在特定行号处插入文本
我正在开发一个bash脚本,该脚本将根据行中的数据拆分文本文档的内容。 如果原始文件的内容与 01 line 01 line 02 line 02 line 我如何使用bash插入此文件的第3行 01 line 01 line text to insert 02 line 02 line 我希望使用heredoc或脚本中的类似内容来执行此操作 #!/bin/bash vim -e -s ./file.txt <<- HEREDOC :3 | startinsert | "text to insert\n" :update :quit HEREDOC 上面的方法当然行不通,但是我可以在此bash脚本中实现的任何建议呢?




7
如何安全获取ksh的版本?
如何从ksh脚本中安全地获取ksh的版本? 我已经看到以下解决方案: ksh --version echo ${.sh.version} echo $KSH_VERSION 在适当的情况下,所有这些方法都可以正常工作。但是,我关心的是不完美的情况。 具体来说,我使用的几台机器具有较旧的ksh版本,出于我的目的,这些版本严重缺乏功能。无论如何,我要(以编程方式)检查版本的原因是要查看ksh版本是否为功能较弱的版本之一。如果是这样,我想用不太出色的代码执行分支。 但是,在有问题的机器上,shell的能力不足导致无法检查版本... 如果我尝试ksh --version,它什么也不打印,并打开一个新实例ksh! 如果尝试echo ${.sh.version},ksh将其视为语法错误,不能使用丢弃2> /dev/null。 $ echo ${.sh.version} 2> /dev/null ksh: ${.sh.version}: bad substitution 当然echo $KSH_VERSION看起来可以正常工作-我的意思是它不会崩溃-尽管在这些机器上它是空白的。另外,我看到的地方是KSH_VERSION只被设定pdksh。 问题: 如何安全地以ksh编程方式检查版本?就我的目的而言,我并不在乎实际的版本号是多少,而只是它是否是的过时版本ksh。 是否$KSH_VERSION足够好?我的意思是,如果空白,那么ksh一定是过时的版本吗?该其他论坛是否正确,即使对于较新版本的,也可能未设置ksh? 根本没有办法检查吗?

4
递归创建所有字母的目录
我想以这样一种方式创建目录,即需要将目录从标记a为z。在每个目录中,我需要创建子目录,以便将其标记为aa,ab等等。 因此,例如,对于目录m,我的子目录将被标记为ma,mb高达mz。

7
提取基本(减后缀)文件名的最后3个字符的最短方法
我正在尝试在sh脚本中将变量设置为文件基本名称的后3个字符(按基本名称,我的意思是没有路径和后缀)。我已经成功完成了此操作,但纯粹出于好奇,我想知道是否可以使用更短的单个命令。最初,我与曾有过一次往来awk,但时间很长。目前,我有以下两行脚本(假设完整的文件名位于中$1): filebase=`basename "$1"` lastpart=`echo -n ${filebase%.*} | tail -c3` 因此,例如,“/path/to/somefile.txt”结束了“ILE”在$lastpart。 我可以以某种方式结合起来,basename然后将后缀剥离为一个命令,是否有一种tail无需使用管道即可将其发送到(或其他可以使用的东西)的方法?后缀是未知的,因此我不能将其作为的参数basename。 实际上,主要目标并不是要尽可能地简短,而要使其一目了然。所有这些的实际上下文是有关Superuser的问题,我试图在其中提出一个相当简单的答案。

2
在目录中查找并删除重复项
我的目录中包含多个img文件,其中一些是相同的,但它们的名称不同。我需要删除重复项,但仅使用bash脚本就不需要外部工具。我是Linux的初学者。我尝试了嵌套的for循环来比较md5总和,并根据结果将其删除,但是语法出了点问题,因此不起作用。有什么帮助吗? 我试过的是... for i in directory_path; do sum1='find $i -type f -iname "*.jpg" -exec md5sum '{}' \;' for j in directory_path; do sum2='find $j -type f -iname "*.jpg" -exec md5sum '{}' \;' if test $sum1=$sum2 ; then rm $j ; fi done done 我得到: test: too many arguments


4
重命名本地文件夹中的文件,添加前缀或后缀
我的文件夹中有很多文件,我想给它们添加前缀或后缀(不是全部)。我在这里检查后发现可以使用 for filename in *.jpg; do mv "$filename" "prefix_$filename"; done; 为所有结尾的文件添加前缀.jpg(如果删除.jpg,它将为当前文件夹中的所有文件添加前缀)。 但是,我希望能够 添加后缀(即重命名filename.ext为filename.whatever.ext), 检查前缀或后缀是否已经存在,然后跳过, 创建接受参数,如别名addprefix whatever *.ext或addsufix whatever *.*

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.