我一直在看其他人写的一些脚本(特别是 Red Hat),他们的很多变量都是使用以下符号分配的
VARIABLE1="${VARIABLE1:-some_val}"
或一些扩展其他变量
VARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}"
使用这种表示法而不是直接声明值有什么意义(例如, VARIABLE1=some_val
)有什么意义?
这种表示法是否有好处或可以防止可能出现的错误?
是否:-
有特定的含义在这方面?
大多数语言都有变量的命名约定,我在 shell 脚本中看到的最常见的样式是MY_VARIABLE=foo
. 这是惯例还是仅适用于全局变量?脚本本地的变量呢?
我可以读取数字和操作:
echo "First number please"
read num1
echo "Second number please"
read num2
echo "Operation?"
read op
Run Code Online (Sandbox Code Playgroud)
但随后我所有添加数字的尝试都失败了:
case "$op" in
"+")
echo num1+num2;;
"-")
echo `num1-num2`;;
esac
Run Code Online (Sandbox Code Playgroud)
跑:
First number please
1
Second mumber please
2
Operation?
+
Run Code Online (Sandbox Code Playgroud)
输出:
num1+num2
Run Code Online (Sandbox Code Playgroud)
...或者...
echo $num1+$num2;;
# results in: 1+2
Run Code Online (Sandbox Code Playgroud)
...或者...
echo `$num1`+`$num2`;;
# results in: ...line 9: 1: command not found
Run Code Online (Sandbox Code Playgroud)
当我尝试添加添加(“2+2”而不是“4”)时,似乎我仍然得到字符串。
$ ls -l /tmp/test/my\ dir/
total 0
Run Code Online (Sandbox Code Playgroud)
我想知道为什么以下运行上述命令的方法失败或成功?
$ abc='ls -l "/tmp/test/my dir"'
$ $abc
ls: cannot access '"/tmp/test/my': No such file or directory
ls: cannot access 'dir"': No such file or directory
$ "$abc"
bash: ls -l "/tmp/test/my dir": No such file or directory
$ bash -c $abc
'my dir'
$ bash -c "$abc"
total 0
$ eval $abc
total 0
$ eval "$abc"
total 0
Run Code Online (Sandbox Code Playgroud) 我需要在if
语句中检查变量是否存在。有以下作用:
if [ -v $somevar ]
then
echo "Variable somevar exists!"
else
echo "Variable somevar does not exist!"
Run Code Online (Sandbox Code Playgroud)
与此最接近的问题是this,它实际上并没有回答我的问题。
我想将表达式的结果(即命令的输出)分配给一个变量,然后对其进行操作——例如,将它与一个字符串连接起来,然后回显它。这是我所拥有的:
#!/bin/bash
cd ~/Desktop;
thefile= ls -t -U | grep -m 1 "Screen Shot";
echo "Most recent screenshot is: "$thefile;
Run Code Online (Sandbox Code Playgroud)
但是输出:
Screen Shot 2011-07-03 at 1.55.43 PM.png
Most recent screenshot is:
Run Code Online (Sandbox Code Playgroud)
因此,它看起来没有分配给$thefile
,并且在执行时正在打印。
我错过了什么?
问题:
所以,我试图使用多条线来分配它。
没有缩进很简单:
VAR="This displays without \
any issues."
echo "${VAR}"
Run Code Online (Sandbox Code Playgroud)
结果:
This displays without any issues.
Run Code Online (Sandbox Code Playgroud)
但是有缩进:
VAR="This displays with \
extra spaces."
echo "${VAR}"
Run Code Online (Sandbox Code Playgroud)
结果:
This displays with extra spaces.
Run Code Online (Sandbox Code Playgroud)
如果没有这些空格,我如何优雅地分配它?
在我的 shell 函数之一中具有以下内容:
function _process () {
awk -v l="$line" '
BEGIN {p=0}
/'"$1"'/ {p=1}
END{ if(p) print l >> "outfile.txt" }
'
}
Run Code Online (Sandbox Code Playgroud)
,所以当被称为 as 时_process $arg
,$arg
会被传递为$1
,并用作搜索模式。它是这样工作的,因为 shell 扩展$1
代替了 awk 模式!也l
可以在 awk 程序中使用,用-v l="$line"
. 一切都很好。
是否可以以相同的方式将模式作为变量进行搜索?
以下将不起作用,
awk -v l="$line" -v search="$pattern" '
BEGIN {p=0}
/search/ {p=1}
END{ if(p) print l >> "outfile.txt" }
'
Run Code Online (Sandbox Code Playgroud)
, 因为 awk 不会解释/search/
为变量,而是按字面意思解释。
在 bash 脚本中:
我们通过命名来创建变量:
abc=ok
Run Code Online (Sandbox Code Playgroud)
或者我们可以使用 declare
declare abc=ok
Run Code Online (Sandbox Code Playgroud)
有什么不同?
为什么 bash 有这么多方法来创建变量?
#!/bin/bash
function0()
{
local t1=$(exit 1)
echo $t1
}
function0
Run Code Online (Sandbox Code Playgroud)
echo
打印空值。我期望:
1
Run Code Online (Sandbox Code Playgroud)
为什么t1
变量没有被分配退出命令的返回值 - 1
?