Questions tagged «shell-script»

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

9
为什么最好用“#!/ usr / bin / env名称”代替“#!/ path / to / NAME”作为我的shebang?
我注意到,我从其他人那里获得的一些脚本具有shebang,#!/path/to/NAME而另一些(使用相同工具NAME)具有shebang #!/usr/bin/env NAME。 两者似乎都能正常工作。在教程中(例如,在Python上),似乎有人建议后者shebang更好。但是,我不太明白为什么会这样。 我意识到,要使用后一个shebang,NAME必须在PATH中,而第一个shebang没有此限制。 另外,对我来说,第一个似乎是更好的shebang,因为它精确指定了NAME的位置。因此,在这种情况下,如果存在多个版本的NAME(例如/ usr / bin / NAME,/ usr / local / bin / NAME),则第一种情况指定要使用的版本。 我的问题是,为什么第一个shebang优先于第二个?

3
在脚本中使用“ $ {a:-b}”进行变量分配
我一直在看别人写的一些脚本(特别是Red Hat),其中许多变量是使用以下表示法分配的, VARIABLE1="${VARIABLE1:-some_val}" 或者扩展了其他变量 VARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}" 使用这种表示法而不是直接声明值(例如VARIABLE1=some_val)有什么意义? 这种表示法是否有好处,还是可以避免的错误? :-在此上下文中是否具有特定含义?

14
在Bash中,何时使用别名,何时编写脚本以及何时编写函数?
我花了将近10年的Linux使用时间问这个问题。这都是反复试验和随机的深夜互联网冲浪。 但是人们不需要10年的时间。如果我刚开始使用Linux,那么我想知道:什么时候使用别名,什么时候编写脚本,什么时候编写函数? 在涉及别名的地方,我将别名用于不带参数的非常简单的操作。 alias houston='cd /home/username/.scripts/' 这似乎很明显。但是有些人这样做: alias command="bash bashscriptname" (并将其添加到.bashrc文件中) 有充分的理由这样做吗?我真的很努力,但是我真的无法想到在任何情况下都需要这样做。因此,如果存在极端情况会有所作为,请在下面回答。 因为那是我要在PATH中放入内容的地方chmod +x,这是经过多年Linux反复试验之后出现的另一件事。 这将我带入下一个主题。举例来说,我添加了一个隐藏的文件夹(.scripts/只需添加一行到我的)主目录到我的PATH .bashrc(PATH=$PATH:/home/username/.scripts/),所以任何可执行文件中有自动的自动填充。 如果需要的话。 不过,我真的不需要那个吗?我只会将其用于非Shell语言,例如Python。 如果是外壳,我可以在相同的内部编写一个函数.bashrc: funcname () { somecommand -someARGS "$@" } 正如我所说,我通过反复试验发现了很多这样的问题。我只有在计算机死机时才真正看到功能的美,而当我周围的人不使用计算机时,我就不得不使用它们。 最终,我没有将整个脚本目录从一个计算机移动到另一个计算机,而是最终只用我自己的其他人替换了.bashrc,因为它们甚至从未进行任何修改。 但是我想念什么吗? 那么,您将如何告诉Linux新手何时使用别名,何时编写脚本以及何时编写函数? 如果不是很明显,我假设回答这个问题的人将使用所有三个选项。如果您仅使用别名,或仅使用脚本,或仅使用函数,或者仅使用别名和脚本,或者别名和函数或脚本和函数,则此问题并不是针对您的。

5
为什么我的Shell脚本会在空白或其他特殊字符上造成窒息?
或者,一个介绍性的指南,介绍了强大的文件名处理以及其他在Shell脚本中传递的字符串。 我编写了一个外壳脚本,该脚本在大多数情况下都能正常工作。但是它在某些输入(例如某些文件名)上阻塞了。 我遇到了以下问题: 我有一个包含空格的文件名hello world,它被视为两个单独的文件hello和world。 我的输入行有两个连续的空格,它们在输入中缩小为一个。 开头和结尾的空格从输入行中消失。 有时,当输入包含一个字符时\[*?,它们会被一些实际上是文件名的文本替换。 输入中有撇号'(或双引号"),从那以后事情变得很奇怪。 输入中有一个反斜杠(或:我正在使用Cygwin,并且我的某些文件名具有Windows样式的\分隔符)。 怎么回事,如何解决?

23
如何在Shell脚本中获取我的外部IP地址?
我需要从外壳脚本中找到我的外部IP地址。目前,我使用此功能: myip () { lwp-request -o text checkip.dyndns.org | awk '{ print $NF }' } 但是这取决于perl-libwww,perl-html-format,perl-html-tree安装。我还能通过哪些其他方式获取我的外部IP?
273 linux  shell-script  ip 

3
在sh脚本中使用sed时,我需要转义哪些字符?
采取以下脚本: #!/bin/sh sed 's/(127\.0\.1\.1)\s/\1/' [some file] 如果我尝试在sh(dashhere)中运行此命令,它将由于括号而失败,该括号需要转义。但是,我并不需要转义反斜线本身(八位位组之间,或\s或\1)。这是什么规则?那我什么时候需要使用{...}或[...]呢?有我要做的和不需要逃避的工作的清单吗?


8
如何测试变量是否为空或仅包含空格?
以下bash语法验证是否param不为空: [[ ! -z $param ]] 例如: param="" [[ ! -z $param ]] && echo "I am not zero" 没有输出,它的罚款。 但是,当param一个(或多个)空格字符为空时,情况就不同了: param=" " # one space [[ ! -z $param ]] && echo "I am not zero" 输出“我不为零”。 如何更改测试以将仅包含空格字符的变量视为空?

3
清空文件内容
我知道三种删除文件中所有条目的方法。 他们是 >filename touch filename filename < /dev/null 在这三个中,我滥用>filename最多,因为这需要最少的击键次数。 但是,我想知道相对于大型日志文件和小型文件,这三种方法(如果有更有效的方法)中效率最高的一种。 另外,这三个代码如何操作和删除内容?

3
忘记在bash / POSIX shell中引用变量的安全隐患
如果您已经关注unix.stackexchange.com一段时间了,那么您现在应该希望知道,echo $var在Bourne / POSIX shell(zsh是例外)的列表上下文中(如)在列表上下文中不加引号的变量具有非常特殊的含义,并且除非您有充分的理由,否则不应该这样做。 在此处的许多问答中对此进行了详细讨论(示例:为什么我的shell脚本为什么在空格或其他特殊字符上感到窒息?,何时需要双引号?,shell变量的扩展以及glob对其的影响和split,引用vs无引号的字符串扩展) 自从70年代末Bourne shell首次发布以来就是这种情况,但Korn shell(David Korn的最大遗憾之一(问题#7))并没有改变它,或者bash主要是复制了Korn shell,这就是POSIX / Unix如何指定的。 现在,我们仍然在这里看到许多答案,甚至偶尔看到一些不引用变量的公开发布的shell代码。您可能以为人们现在已经学到了。 根据我的经验,主要有3种类型的人忽略了引用其变量: 初学者。可以原谅这是完全不直观的语法。这是我们在此站点上进行教育的职责。 健忘的人。 甚至在反复敲打之后仍然没有被说服的人,他们认为Bourne shell的作者肯定不打算让我们引用所有变量。 如果我们暴露与此类行为相关的风险,也许我们可以说服他们。 如果忘记引用变量,最糟糕的事情莫过于发生。真的那么糟糕吗? 我们在这里谈论什么样的漏洞? 在什么情况下会出现问题?


12
如何更改多个文件的扩展名?
我想将文件扩展名从更改*.txt为*.text。我尝试使用该basename命令,但是在更改多个文件时遇到了麻烦。 这是我的代码: files=`ls -1 *.txt` for x in $files do mv $x "`basename $files .txt`.text" done 我收到此错误: basename: too many arguments Try basename --help' for more information




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.