是否可以$?在测试后保持最后一个命令退出状态 ( ) 不变?
例如,我想做:
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) 如果我想在未设置变量的情况下执行某些命令,我正在使用:
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) 的一个新成员?
目前我有下一个路径
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
我希望你能理解我在做什么!提前致谢
这从终端工作:
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。
今天我注意到我的一个 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)
任何人都可以解释第一个对我来说很奇怪的原因吗?
我想为我的.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>等之类的内容?
做 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实际定义了一个变量(为空)。
有一个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)
如果不可能,请解释原因。
我想使用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 解决方案。