标签: variable

以空合并方式设置 shell 变量

我真的很喜欢“空合并”,您可以在其中将变量设置为事物列表中的第一个“非空”值。许多语言都支持这一点,例如:

C#:

String myStr = string1 ?? string2 ?? "default";
Run Code Online (Sandbox Code Playgroud)

JavaScript:

var myStr = string1 || string2 || "default";
Run Code Online (Sandbox Code Playgroud)

...等等。我只是好奇这是否可以在 Bash 中完成以设置变量?

伪:

MY_STR=$ENV{VAR_NAME}??$ANOTHER_VAR??"default";
Run Code Online (Sandbox Code Playgroud)

shell bash variable

33
推荐指数
2
解决办法
1万
查看次数

将 shell 变量用于命令选项

在 Bash 脚本中,我试图将我使用的选项存储rsync在一个单独的变量中。这适用于简单的选项(如--recursive),但我遇到了--exclude='.*'以下问题:

$ find source
source
source/.bar
source/foo

$ rsync -rnv --exclude='.*' source/ dest
sending incremental file list
foo

sent 57 bytes  received 19 bytes  152.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

$ RSYNC_OPTIONS="-rnv --exclude='.*'"

$ rsync $RSYNC_OPTIONS source/ dest
sending incremental file list
.bar
foo

sent 78 bytes  received 22 bytes  200.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)
Run Code Online (Sandbox Code Playgroud)

As you can see, passing --exclude='.*' …

bash variable

33
推荐指数
2
解决办法
2万
查看次数

如何将变量发送到内联 shell 脚本?

我运行以下脚本:

VAR="Test"
sh -c 'echo "Hello $VAR"'
Run Code Online (Sandbox Code Playgroud)

但我得到:

# ./test.sh
Hello
Run Code Online (Sandbox Code Playgroud)

如何将VAR我的脚本变量发送到使用sh -c '...'.

shell scripting shell-script variable

30
推荐指数
3
解决办法
4万
查看次数

替换变量中字符的最短方法

有很多方法可以替换变量中的字符。

tr到目前为止,我发现的最短方法是:

OUTPUT=a\'b\"c\`d_123and_a_lot_more
OUTPUT=$(echo "$OUTPUT"|tr -d "'\`\"")
echo $OUTPUT
Run Code Online (Sandbox Code Playgroud)

有没有更快的方法?对于像',"和 ` 本身这样的引号,这种引用安全吗?

bash string variable

29
推荐指数
4
解决办法
11万
查看次数

为什么我的变量在一个“while read”循环中是局部变量,而在另一个看似相似的循环中却不是?

为什么我$x从下面的片段中得到不同的值?

#!/bin/bash

x=1
echo fred > junk ; while read var ; do x=55 ; done < junk
echo x=$x 
#    x=55 .. I'd expect this result

x=1
cat junk | while read var ; do x=55 ; done
echo x=$x 
#    x=1 .. but why?

x=1
echo fred | while read var ; do x=55 ; done
echo x=$x 
#    x=1  .. but why?
Run Code Online (Sandbox Code Playgroud)

pipe shell-script variable-substitution variable

28
推荐指数
3
解决办法
3万
查看次数

shell 脚本中变量赋值中的空格

以下变量赋值有什么区别?

var=23
var =23
var= 23
var = 23
Run Code Online (Sandbox Code Playgroud)

赋值运算符周围的空间有什么不同吗?

shell variable assignment

27
推荐指数
2
解决办法
1万
查看次数

为什么当我想让它打印变量时 awk 打印整行?

当我输入:

echo "foo bar" | gawk -v var="content" '{print $var}'
Run Code Online (Sandbox Code Playgroud)

我希望输出为content. 为什么foo bar

awk variable

25
推荐指数
1
解决办法
2万
查看次数

如何正确临时保存和恢复 IFS 变量?

如何正确运行一些更改了IFS变量值的命令(以更改字段拆分的工作方式和"$*"处理方式),然后恢复 的原始值IFS

我知道我能做到

(
    IFS='my value here'
    my-commands here
)
Run Code Online (Sandbox Code Playgroud)

将 的更改本地化IFS到子外壳,但我真的不想启动子外壳,尤其是如果我需要更改或设置需要在子外壳之外可见的变量的值时更是如此。

我知道我可以使用

saved_IFS=$IFS; IFS='my value here'
my-commands here
IFS=$saved_IFS
Run Code Online (Sandbox Code Playgroud)

IFS在原始IFS实际上未设置的情况下,这似乎无法正确恢复。

寻找与 shell 无关(但 POSIX)的答案。

澄清:上面的最后一行意味着我对bash-exclusive 解决方案不感兴趣。事实上,我使用最多的系统 OpenBSDbash在默认情况下甚至根本没有安装,而且bash它不是我用来回答本网站问题以外的任何其他事情的外壳。看到我可以在bash或其他类似 POSIX 的 shell 中使用的解决方案更有趣,而无需努力编写不可移植的代码。

shell variable

25
推荐指数
2
解决办法
962
查看次数

dirname 和 basename vs 参数扩展

是否有任何客观理由偏爱一种形式而不是另一种形式?性能、可靠性、便携性?

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"
Run Code Online (Sandbox Code Playgroud)

产生:

/some/long/path/to
/some/long/path/to
a_file
a_file
Run Code Online (Sandbox Code Playgroud)

(v1 使用 shell 参数扩展,v2 使用外部二进制文件。)

shell shell-script filenames basename variable

24
推荐指数
3
解决办法
3万
查看次数

bash 动态(变量)变量名

我想通过操作元素数组并创建一些算术过程来动态创建字符串序列。

for name in FIRST SECOND THIRD FOURTH FIFTH; do
    $name = $(( $6 + 1 ))
    $name = "${$name}q;d"
    echo "${$name}"; printf "\n"
done
Run Code Online (Sandbox Code Playgroud)

期望结果将是下面的$6equals 0

1q;d
2q;d
3q;d
4q;d
5q;d
Run Code Online (Sandbox Code Playgroud)

但我收到这个错误

reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
Run Code Online (Sandbox Code Playgroud)

我想这很简单。当我做类似的事情时它曾经工作过

FIRST=$(( $6 + 1 …
Run Code Online (Sandbox Code Playgroud)

bash variable

23
推荐指数
3
解决办法
6万
查看次数