我真的很喜欢“空合并”,您可以在其中将变量设置为事物列表中的第一个“非空”值。许多语言都支持这一点,例如:
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) 在 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='.*' …
我运行以下脚本:
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 '...'.
有很多方法可以替换变量中的字符。
tr到目前为止,我发现的最短方法是:
OUTPUT=a\'b\"c\`d_123and_a_lot_more
OUTPUT=$(echo "$OUTPUT"|tr -d "'\`\"")
echo $OUTPUT
Run Code Online (Sandbox Code Playgroud)
有没有更快的方法?对于像',"和 ` 本身这样的引号,这种引用安全吗?
为什么我$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) 以下变量赋值有什么区别?
var=23
var =23
var= 23
var = 23
Run Code Online (Sandbox Code Playgroud)
赋值运算符周围的空间有什么不同吗?
当我输入:
echo "foo bar" | gawk -v var="content" '{print $var}'
Run Code Online (Sandbox Code Playgroud)
我希望输出为content. 为什么foo bar?
如何正确运行一些更改了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 中使用的解决方案更有趣,而无需努力编写不可移植的代码。
是否有任何客观理由偏爱一种形式而不是另一种形式?性能、可靠性、便携性?
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 使用外部二进制文件。)
我想通过操作元素数组并创建一些算术过程来动态创建字符串序列。
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)