我想知道是否有办法将&符号放在变量中并仍然使用它来将进程发送到后台。
这有效:
BCKGRND=yes
if [ "$BCKGRND" = "yes" ]; then
sleep 5 &
else
sleep 5
fi
Run Code Online (Sandbox Code Playgroud)
但是只用一个来完成这五行不是很酷吗?像这样:
BCKGRND='&'
sleep 5 ${BCKGRND}
Run Code Online (Sandbox Code Playgroud)
但这不起作用。如果 BCKGRND 没有设置它就可以工作 - 但是当它被设置时,它被解释为一个文字 '&' 并出错。
是
x=$y
Run Code Online (Sandbox Code Playgroud)
和
x="$y"
Run Code Online (Sandbox Code Playgroud)
总是等价的?不知道如何寻找这个。到目前为止,我一直习惯于x="$y"“安全起见”。但我x=$1曾经使用过并注意到,显然,我什至不需要额外的双引号。
The Open Group POSIX 文档中定义的行为在哪里?
是否可以$?在测试后保持最后一个命令退出状态 ( ) 不变?
例如,我想做:
command -p sudo ...
[ $? -ne 1 ] && exit $?
Run Code Online (Sandbox Code Playgroud)
最后一个exit $?应该返回 sudo 退出状态,但它总是返回0(测试的退出代码)。
没有临时变量可以做到这一点吗?
另一个进一步澄清的例子:
spd-say "$@"
[ $? -ne 127 ] && exit $?
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我只想在找到第一个命令时退出(退出代码 != 127)。我想用实际的spd-say退出代码退出(可能不是
0)。
编辑:我忘了提到我更喜欢 POSIX-complaint 解决方案以获得更好的可移植性。
我在脚本中使用这个构造,我想为相同的命令提供替代方案。例如,请参阅我的crc32 脚本。
临时变量的问题在于它们可能会影响其他变量,并且为了避免必须使用长名称,这对代码可读性不利。
我试图将“var name”传递给函数,让函数转换具有此类“var name”的变量包含的值,然后能够通过其原始“var name”引用转换后的对象。
例如,假设我有一个将分隔列表转换为数组的函数,并且我有一个名为“animal_list”的分隔列表。我想通过将列表名称传递给函数,然后将 now 数组引用为“animal_list”来将该列表转换为数组。
代码示例:
function delim_to_array() {
local list=$1
local delim=$2
local oifs=$IFS;
IFS="$delim";
temp_array=($list);
IFS=$oifs;
# Now I have the list converted to an array but it's
# named temp_array. I want to reference it by its
# original name.
}
# ----------------------------------------------------
animal_list="anaconda, bison, cougar, dingo"
delim_to_array ${animal_list} ","
# After this point I want to be able to deal with animal_name as an array.
for animal in "${animal_list[@]}"; do
echo "NAME: $animal"
done …Run Code Online (Sandbox Code Playgroud) 我想转换这个 Bash 循环:
x="one two three"
for i in ${x}
do
echo ${i}
done
Run Code Online (Sandbox Code Playgroud)
以这种方式同时使用 Bash 和 zsh
此解决方案有效:
x=( one two three )
for i in ${x[@]}
do
echo ${i}
done
Run Code Online (Sandbox Code Playgroud)
无论如何,我正在x从字符串修改为数组。
$x当 zsh 是字符串并且以与 Bash 兼容的方式时,有没有办法在 zsh 中循环?
我知道zsh的setopt shwordsplit模仿猛砸,但我不能将其设置特设的循环,因为它不会在Bash的工作。
`
我想编写以变量名称作为输入的函数(我们称之为 superEcho)。该函数应该打印该变量的名称及其值
function superEcho
{
echo "$1: ?????"
}
var=100
superEcho var
Run Code Online (Sandbox Code Playgroud)
我希望这个脚本返回
var: 100
Run Code Online (Sandbox Code Playgroud)
但我不知道应该用什么代替“?????” 在 superEcho 功能中。
我有这个 while 循环和 here-document 组合,我在 Bash 4.3.48(1) 中运行,我根本不明白它的逻辑。
while read file; do source ~/unwe/"$file"
done <<-EOF
x.sh
y.sh
EOF
Run Code Online (Sandbox Code Playgroud)
我的问题由以下部分组成:
read这里做什么(我总是read用来声明一个变量并以交互方式分配它的值,但我错过了它应该在这里做什么)。
是什么意思while read?while进来的概念从哪里来?
如果 here-document 本身出现在循环之后,它甚至如何受到循环的影响?我的意思是,它出现在 之后done,而不是在循环内部,那么这两个结构之间的实际关联是什么?
为什么这会失败?
while read file; do source ~/unwe/"$file" done <<-EOF
x.sh
y.sh
EOF
Run Code Online (Sandbox Code Playgroud)
我的意思是,done是done...那么为什么done <<-EOF与循环在同一行上很重要?如果我没记错的话,我确实遇到过这样一种情况,其中for循环是单行的并且仍然有效。
是否可以使用 bash 减去包含 24 小时时间的变量?
#!/bin/bash
var1="23:30" # 11:30pm
var2="20:00" # 08:00pm
echo "$(expr $var1 - $var2)"
Run Code Online (Sandbox Code Playgroud)
运行它会产生以下错误。
./test
expr: non-integer argument
Run Code Online (Sandbox Code Playgroud)
我需要输出以十进制形式出现,例如:
./test
3.5
Run Code Online (Sandbox Code Playgroud) 我想要echoBash 3.2.52 中的所有非环境变量(所有自我声明的变量)。
这个打印所有变量的命令给了我我无法理解的输出,这在我看来与set -x && clear -r我已经工作的模式冲突。
diff -U 1 <(set -o posix ; set |cut -d= -f1) <(
exec bash -ic 'set -o posix ; set' | cut -d= -f1) |
grep '^[-][^-]' |
cut -d- -f2 |
grep -vE '^(COLUMNS|HISTFILESIZE|HISTSIZE|LINES|PIPESTATUS)$'
Run Code Online (Sandbox Code Playgroud)
我需要一个echo或printf(或任何其他“更简单”的)操作来获得这样的列表。
如果可能在这个版本的 Bash 中,如何实现?
命令可以存储在变量中并在 shell 中执行(尽管不是一个好的做法),例如:
command='ls -l A* "B\" type"'
$command
Run Code Online (Sandbox Code Playgroud)
A它列出了以、"B\"和开头的文件type"。执行参数分隔和通配符,但不删除引号和转义。这种行为使得在不支持数组的 shell 中使用一个变量传递任意参数非常困难,并且不可能安全地组合find其他命令for(这经常被讨论)。它甚至限制了通配符的使用,因为许多字符在未加引号的变量扩展中不受控制(您无法存储包含 `'"*?\n文字的通配符序列并正确重用它们)。
如果可以处理变量中的引号和转义序列,情况将会非常不同。但为什么大多数 shell 实际上不这样做呢?它是专门设计的,有一些我没有注意到的晦涩的考虑,还是只是简单地传承下来以保持兼容性?我知道有类似的问题,例如Why does bashvariableexpansionretainquotes? 和“变量中的命令”中的引用/转义/扩展问题讨论了行为,但那里的答案没有谈论原因。
variable ×10
bash ×6
shell-script ×6
shell ×2
arithmetic ×1
assignment ×1
control-flow ×1
date ×1
echo ×1
exit-status ×1
function ×1
posix ×1
quoting ×1
read ×1
scripting ×1
zsh ×1