我一直在看其他人写的一些脚本(特别是 Red Hat),他们的很多变量都是使用以下符号分配的
VARIABLE1="${VARIABLE1:-some_val}"
或一些扩展其他变量
VARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}"
使用这种表示法而不是直接声明值有什么意义(例如, VARIABLE1=some_val)有什么意义?
这种表示法是否有好处或可以防止可能出现的错误?
是否:-有特定的含义在这方面?
我注意到我从其他人那里获得的一些脚本有 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比第二个更受欢迎?
我知道 shell 脚本只是运行命令,就好像它们是在命令提示符下执行的一样。我希望能够像运行函数一样运行 shell 脚本......也就是说,将输入值或字符串带入脚本中。我该如何处理?
我用了将近 10 年的 Linux 才问出这个问题。这都是反复试验和随机深夜上网。
但是人们不应该为此需要10年。如果我刚开始使用 Linux,我想知道:何时使用别名、何时编写脚本以及何时编写函数?
就别名而言,我将别名用于不带参数的非常简单的操作。
alias houston='cd /home/username/.scripts/'
Run Code Online (Sandbox Code Playgroud)
这似乎很明显。但有些人这样做:
alias command="bash bashscriptname"
Run Code Online (Sandbox Code Playgroud)
(并将其添加到.bashrc文件中)
这样做有充分的理由吗?我真的很努力,但我真的想不出任何我想要这样做的情况。因此,如果存在会产生影响的边缘情况,请在下面回答。
因为那是我将一些东西放入我的 PATH 和chmod +x它的地方,这是经过多年 Linux 反复试验后出现的另一件事。
这让我进入下一个话题。例如,我.scripts/通过在我的.bashrc( PATH=$PATH:/home/username/.scripts/) 中添加一行,在主目录中添加了一个隐藏文件夹 ( ) 到我的 PATH ,因此那里的任何可执行文件都会自动自动完成。
如果我需要的话。
不过,我真的不需要那个,不是吗?我只会将它用于不是 shell 的语言,比如 Python。
如果是 shell,我可以在里面写一个函数.bashrc:
funcname () {
somecommand -someARGS "$@"
}
Run Code Online (Sandbox Code Playgroud)
正如我所说,我通过反复试验发现了很多。只有当我的电脑没电了,我才真正看到了功能之美,我不得不在周围人不使用它们的时候使用它们。
我没有将整个脚本目录从计算机移动到计算机,而是将其他人的 .bashrc 替换为我自己的,因为他们甚至从未进行过任何修改。
但我错过了什么吗?
那么,关于何时使用别名、何时编写脚本以及何时编写函数,您会告诉 Linux 初学者什么?
如果这不明显,我假设回答这个问题的人会使用所有三个选项。如果你只使用别名,或者只使用脚本,或者只使用函数——或者如果你只使用别名和脚本或别名和函数或脚本和函数——这个问题并不是真正针对你的。
我知道这个问题以前可能已经回答过。我在不同的地方看到了很多关于这个的话题,但对我来说通常很难提取答案。我正在寻找有关“sed”命令的示例用法的帮助。
假设我想对文件“hello.txt”(在与提示相同的目录中)进行操作。任何包含“很少”一词的地方,都应改为“asd”。命令会是什么样的?
执行以下脚本:
#!/bin/sh
sed 's/(127\.0\.1\.1)\s/\1/' [some file]
Run Code Online (Sandbox Code Playgroud)
如果我尝试在sh( dashhere) 中运行它,它会因为需要转义的括号而失败。但是,我并不需要转义反斜线本身(八位位组之间,或\s或\1)。这里的规则是什么?当我需要使用{...}或 时[...]呢?有没有我做什么和不需要逃避的清单?
或者,有关强大的文件名处理和在 shell 脚本中传递的其他字符串的介绍性指南。
我写了一个 shell 脚本,它在大多数情况下运行良好。但它在某些输入(例如某些文件名)上窒息。
我遇到了如下问题:
hello world,它被视为两个单独的文件hello和world.\[*?,它们会被一些文本替换,这实际上是文件的名称。'(或双引号"),在那之后事情变得很奇怪。\分隔符)。这是怎么回事,我该如何解决?
这个问题是我之前问题的续集。该站点上的用户帮助我确定了如何编写一个for遍历字符串值的 bash循环。例如,假设循环控制变量fname遍历字符串"a.txt" "b.txt" "c.txt"。我想echo“是的!” 何时fname具有值"a.txt"or "c.txt",并且echo“不!” 除此以外。我尝试了以下 bash shell 脚本:
#!/bin/bash
for fname in "a.txt" "b.txt" "c.txt"
do
echo $fname
if [ "$fname" = "a.txt" ] | [ "$fname" = "c.txt" ]; then
echo "yes!"
else
echo "no!"
fi
done
Run Code Online (Sandbox Code Playgroud)
我获得输出:
一个.txt
不!
b.txt
不!
文件
是的!
为什么该if语句在fname具有 value时显然会产生 true "a.txt"?我用|错了吗?
我需要从 shell 脚本中找到我的外部 IP 地址。目前我使用这个功能:
myip () {
lwp-request -o text checkip.dyndns.org | awk '{ print $NF }'
}
Run Code Online (Sandbox Code Playgroud)
但这取决于perl-libwww, perl-html-format,perl-html-tree已安装。我可以通过哪些其他方式获得我的外部 IP?
以下 bash 语法验证是否param不为空:
[[ ! -z $param ]]
Run Code Online (Sandbox Code Playgroud)
例如:
param=""
[[ ! -z $param ]] && echo "I am not zero"
Run Code Online (Sandbox Code Playgroud)
没有输出,很好。
但是当param除了一个(或多个)空格字符为空时,情况就不同了:
param=" " # one space
[[ ! -z $param ]] && echo "I am not zero"
Run Code Online (Sandbox Code Playgroud)
“我不是零”是输出。
如何更改测试以将仅包含空格字符的变量视为空?
shell-script ×10
bash ×5
function ×2
quoting ×2
sed ×2
shell ×2
alias ×1
command-line ×1
ip ×1
linux ×1
scripting ×1
shebang ×1
string ×1
variable ×1
whitespace ×1