标签: variable

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

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

例如,我想做:

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万
查看次数

为什么 [[ -z ]] 和 [[ -v ]] 有不同的语法?

如果我想在未设置变量的情况下执行某些命令,我​​正在使用:

if [[ -z "$a" || -z "$v" ]]
then
  echo "a or b are not set"
fi
Run Code Online (Sandbox Code Playgroud)

然而相同的语法不适用于-v,我必须使用:

if [[ -v a && -v b ]]
then
  echo "a & b are set"
fi
Run Code Online (Sandbox Code Playgroud)

这背后的历史是什么?我不明白为什么语法不一样。我读过这-v是 bash (4.2) 的一个新成员

bash test variable

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

在变量名中调用其他变量(Bash)

目前我有下一个路径

langs="EN GE"
dir_EN=/xx
dir_GE=/zz
Run Code Online (Sandbox Code Playgroud)

如您所见,变量 $langs 在单个数组中包含所有可能的语言。我想使用检查语言是什么的循环将所有这些路径保存在多语言(dir_ML)数组中,然后保存相应的路径。这是我到目前为止所拥有的

for i in $(seq 0 1); do #I used seq because I didn't know how to specify the length of the variable $langs
    dir_ML[$i]=dir_${langs[$i]}
done
Run Code Online (Sandbox Code Playgroud)

我正在寻找的输出是

dir_ML[0]=/xx

dir_ML[1]=/zz

我希望你能理解我在做什么!提前致谢

bash shell-script variable-substitution variable

7
推荐指数
2
解决办法
2071
查看次数

ls 带通配符

这从终端工作:

ls /dev/sda*
Run Code Online (Sandbox Code Playgroud)

我想在 bash 脚本中使用变量。我试过:

device="a"
ls "/dev/sd"$device"*"
Run Code Online (Sandbox Code Playgroud)

但我收到错误:ls: cannot access '/dev/sda*': No such file or directory

ls quoting wildcards variable

7
推荐指数
2
解决办法
3771
查看次数

我的变量的值为 0,但我没有将其设置为 0

今天我注意到我的一个 zsh 函数不起作用;我调查了这个问题,罪魁祸首是:

for i in a b
do
echo "$i"
done
0
0
Run Code Online (Sandbox Code Playgroud)

然后我打开了一个新的 zsh,一切正常:

for i in a b
do
echo "$i"
done
a
b
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释第一个对我来说很奇怪的原因吗?

zsh variable

7
推荐指数
1
解决办法
337
查看次数

在 Bash 的别名中插入用户定义的变量

我想为我的.bashrc文件中的命令添加别名,如下例所示:

alias take_row="cat prova.csv_001.txt | awk -v nrow="${nrow}" '{if (NR==nrow) print}'"
Run Code Online (Sandbox Code Playgroud)

但是我想nrow在从终端启动命令时指定变量。举个例子:

take_row 1 --> 脚本取第一行

take_row 20 --> 脚本取第 20 行

如何在命令中写入诸如<command> | <read nrow user input>等之类的内容?

bash alias variable

7
推荐指数
1
解决办法
1644
查看次数

`declare -a A` 是否在 Bash 中创建一个空数组 `A`?

declare -a A创建一个空的数组A在bash,或者它只是设置的情况下,一个属性A被分配到以后呢?

考虑这个代码:

set -u
declare -a A
echo ${#A[*]}
echo ${A[*]}
A=()
echo ${#A[*]}
echo ${A[*]}
A=(1 2)
echo ${#A[*]}
echo ${A[*]}
Run Code Online (Sandbox Code Playgroud)

预期的输出应该是什么?

在 Bash 4.3.48(1) 中,我bash: A: unbound variable在查询declare. 访问所有元素时,我也会收到该错误。我知道更高版本的 Bash 对此有不同的处理方式。我仍然想知道是否declare实际定义了一个变量(为空)。

bash array variable declare

7
推荐指数
1
解决办法
2541
查看次数

如何获取一些 shell 代码而不是文件?

有一个source命令的描述:

source是一个 bash shell 内置命令,它在当前 shell 中执行作为参数传递的文件的内容。它有一个同义词.(句号)。

例如,为了进行实验,我想zsh在我的例子中从不同的 shell 导出一个变量(在 中运行命令bash):

$ zsh -c "export test=$(echo "hello world")"
$ echo $test

$
Run Code Online (Sandbox Code Playgroud)

它不起作用,因为该命令在zsh子 shell 中运行,并且不是直接在bash.

如果我以这种方式创建并获取脚本:

#!/home/linuxbrew/.linuxbrew/bin/zsh

export test=$(echo "hello world")
Run Code Online (Sandbox Code Playgroud)
$ chmod 777 test.zsh
$ source test.zsh
$ echo $test
hello world
Run Code Online (Sandbox Code Playgroud)

工作正常。

问题是如何在source不使用脚本的情况下执行命令,因为source只能使用文件运行?我想实现这样的目标:

source zsh -c "export test=$(echo "hello world")"
Run Code Online (Sandbox Code Playgroud)

如果不可能,请解释原因。

bash source zsh variable

7
推荐指数
1
解决办法
2087
查看次数

使用 POSIX 参数扩展从变量中删除重复的字符串模式

我想使用2.6.2 参数扩展从字符串中删除前导字符,但惊讶地发现“删除最大前缀模式”不会自动重复该模式。

$ x=aaaaabc
$ printf %s\\n "${x##a}"
aaaabc
Run Code Online (Sandbox Code Playgroud)

如您所见,只有第一个a已被删除。预期输出为、、或中bc的任何一个。x=bcx=abcx=aabcx=aaabcx=aaaabc

a如果我想从 的开头删除尽可能多的内容,我正在努力弄清楚如何编写该模式$x。我也没有运气搜索其他线程,因为许多答案都使用 bash,但我正在寻找 POSIX shell 解决方案。

scripting parameter shell-script posix variable

7
推荐指数
3
解决办法
592
查看次数