标签: variable

“可变”符号(背景一个过程)

我想知道是否有办法将&符号放在变量中并仍然使用它来将进程发送到后台。

这有效:

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 没有设置它就可以工作 - 但是当它被设置时,它被解释为一个文字 '&' 并出错。

bash shell-script background-process variable

9
推荐指数
3
解决办法
1364
查看次数

在 POSIX 脚本中,x=$y 是否始终等于 x="$y"?

x=$y
Run Code Online (Sandbox Code Playgroud)

x="$y"
Run Code Online (Sandbox Code Playgroud)

总是等价的?不知道如何寻找这个。到目前为止,我一直习惯于x="$y"“安全起见”。但我x=$1曾经使用过并注意到,显然,我什至不需要额外的双引号。

The Open Group POSIX 文档中定义的行为在哪里?

scripting shell-script posix variable assignment

9
推荐指数
1
解决办法
759
查看次数

测试后如何保持上次退出状态

是否可以$?在测试后保持最后一个命令退出状态 ( ) 不变?

例如,我想做:

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 脚本

临时变量的问题在于它们可能会影响其他变量,并且为了避免必须使用长名称,这对代码可读性不利。

shell-script variable exit-status

8
推荐指数
4
解决办法
1万
查看次数

如何对 bash 函数中的参数使用按引用调用

我试图将“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 shell-script function variable

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

在 zsh 和 Bash 中循环一个字符串

我想转换这个 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的工作。

`

bash zsh quoting variable

8
推荐指数
2
解决办法
4787
查看次数

制作一个显示变量名称及其值的函数

我想编写以变量名称作为输入的函数(我们称之为 superEcho)。该函数应该打印该变量的名称及其值

function superEcho
{
     echo "$1: ?????"
}

var=100

superEcho var
Run Code Online (Sandbox Code Playgroud)

我希望这个脚本返回

var: 100
Run Code Online (Sandbox Code Playgroud)

但我不知道应该用什么代替“?????” 在 superEcho 功能中。

shell bash shell-script variable

8
推荐指数
2
解决办法
1179
查看次数

一个 while 循环和一个 here-document - 什么时候发生?

我有这个 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)

我的问题由以下部分组成:

  1. read这里做什么(我总是read用来声明一个变量并以交互方式分配它的值,但我错过了它应该在这里做什么)。

  2. 是什么意思while readwhile进来的概念从哪里来?

  3. 如果 here-document 本身出现循环之后,它甚至如何受到循环的影响?我的意思是,它出现在 之后done,而不是在循环内部,那么这两个结构之间的实际关联是什么?

  4. 为什么这会失败?

    while read file; do source ~/unwe/"$file" done <<-EOF
        x.sh
        y.sh
    EOF
    
    Run Code Online (Sandbox Code Playgroud)

    我的意思是,donedone...那么为什么done <<-EOF与循环在同一行上很重要?如果我没记错的话,我确实遇到过这样一种情况,其中for循环是单行的并且仍然有效。

text-processing control-flow here-document variable read

8
推荐指数
1
解决办法
6644
查看次数

使用bash减去时间?

是否可以使用 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)

bash date arithmetic variable

8
推荐指数
2
解决办法
8230
查看次数

如何在bash中列出所有非环境变量?

我想要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)

我需要一个echoprintf(或任何其他“更简单”的)操作来获得这样的列表。
如果可能在这个版本的 Bash 中,如何实现?

bash echo variable

8
推荐指数
1
解决办法
1354
查看次数

变量扩展中缺少引号删除和转义背后的想法是什么?

命令可以存储在变量中并在 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? “变量中的命令”中的引用/转义/扩展问题讨论了行为,但那里的答案没有谈论原因。

shell shell-script variable

8
推荐指数
2
解决办法
529
查看次数