shell $相关总结

1 $0, $1, $2,…, $n

  • $0:这个特殊一点表示命令本身;
  • $1: 表示第一个参数;
  • $2:表示第二个参数;
  • $n:表示第n个参数;
[root@localhost shell]# cat script.sh 
echo $0
echo $1
echo $2
[root@localhost shell]# ./script.sh Hello World
./script.sh
Hello
World

注意: 由于历史原因, $n只能针对10以内的数字,大于等于10需要用括号将数值包括起来

[jiangjian@localhost shell]$ cat echoArguments.sh 
#! /bin/bash
echo $1
echo $9
echo $10
echo ${10}
[jiangjian@localhost shell]$ ./echoArguments.sh 1 2 3 4 5 6 7 8 9 a b
1
9
10
a
[jiangjian@localhost shell]$ 

2 $#

$#:表示实际的参数个数;

[root@localhost shell]# cat arguments-length.sh 
echo "length is " $#
[root@localhost shell]# ./arguments-length.sh 1 2 3 4 5 6
length is  6

3 $$

$$:表示当前进程的pid;

[root@localhost shell]# cat output-pid.sh 
echo "my pid is " $$
[root@localhost shell]# ./output-pid.sh 
my pid is  47282
[root@localhost shell]# echo $$
46946
[root@localhost shell]# 

4 $?

$?:表示上一个命令执行的退出状态

[root@localhost shell]# cat error.sh 
exit 66 
[root@localhost shell]# ./error.sh 
[root@localhost shell]# echo $?
66
[root@localhost shell]# 

5 $!

$!:表示最近一个后台执行程序的pid;

[root@localhost shell]# sleep 60 &
[1] 47395
[root@localhost shell]# sleep 70 &
[2] 47396
[root@localhost shell]# echo $!
47396
[root@localhost shell]# 

6 $* 和 $@的区别

$*: Stores all the arguments that were entered on the
command line ($1 $2 …).

"$@": Stores all the arguments that were entered
on the command line, individually quoted ("$1" “$2” …).

[root@localhost shell]# cat arguments.sh 
#!/bin/bash

echo "Using \"\$*\":"
for a in "$*"; do
    echo $a;
done

echo -e "\nUsing \$*:"
for a in $*; do
    echo $a;
done

echo -e "\nUsing \"\$@\":"
for a in "$@"; do
    echo $a;
done

echo -e "\nUsing \$@:"
for a in $@; do
    echo $a;
done  
[root@localhost shell]# ./arguments.sh one two "three four"
Using "$*":
one two three four

Using $*:
one
two
three
four

Using "$@":
one
two
three four

Using $@:
one
two
three
four
[root@localhost shell]# 

<think>首先,用户的问题是:“shell ${!} 可以引用数组吗”,这是在问Shell脚本中,${!} 是否可以用于引用数组。 我需要回忆一下Shell脚本的知识。在Bash中,${!} 是一个特殊的参数扩展。它用于间接引用变量。具体来说,${!var} 表示引用变量名为 $var 的值的变量。 例如: ```bash var="name" name="John" echo ${!var} # 输出 John,因为 $var 的值是 "name",所以 ${!var} 引用了 $name ``` 现在,问题是关于数组的。在Bash中,数组可以用索引或关联数组来表示。用户问 ${!} 是否可以引用数组。 ${!} 本身是无效的语法;它必须是 ${!something}。在参数扩展中,${!prefix*} 或 ${!prefix@} 用于获取以特定前缀开头的变量名列表。 对于数组,${!array[@]} 或 ${!array[*]} 用于获取数组的所有键(索引)。例如: ```bash arr=(a b c) echo ${!arr[@]} # 输出 0 1 2,即索引列表 ``` 所以,${!} 不能直接引用数组元素,但 ${!array_name[@]} 用于获取数组的键。 用户的问题是:“shell ${!} 可以引用数组吗”,可能是在问 ${!} 这个语法是否可以用于数组引用。 在标准Shell中,${!} 单独使用是无效的。它需要有一个参数。在Bash中,${!var} 用于间接引用,而 ${!array[@]} 用于获取数组索引。 所以,回答应该是:${!} 本身不能直接引用数组,但在Bash中,${!array_name[@]} 可以用于获取数组的索引。 现在,我需要用中文回答,因为用户要求“请使用中文回答问题”。 回答结构: 1. 直接回答问题。 2. 解释原因或提供例子。 3. 在末尾添加 §§相关问题§§,包含3-5个相关问题。 最后,必须输出 §§相关问题§§ 在第一行,然后列出问题。 用户说:“请在回答完问题后,必须根据用户的问题及你的回答提出3-5个 §§相关问题§§。” 和 “§§相关问题§§ 必须输出在回答的末尾且不可缺少! 第一行必须完整且输出 "§§相关问题§§"!禁止换行分散。” 所以,在回答的最后部分,输出: §§相关问题§§ 1. ... 2. ... 3. ... 问题应该基于用户的问题和我的回答。 现在,构建回答: - 先回答问题:在Shell中,${!} 本身不能直接引用数组。但在Bash中,${!array[@]} 可以用于获取数组的索引。 用中文: 在Shell脚本中,${!} 语法本身不能直接用于引用数组。然而,在Bash中,${!array_name[@]} 可以用于获取数组的所有索引。 提供例子: 例如,在Bash中: ```bash arr=(apple banana cherry) echo ${!arr[@]} # 输出:0 1 2 ``` 如果用户指的是间接引用数组,${!var} 可以引用另一个变量,但如果那个变量是数组名,它可能不会按预期工作,因为数组需要特殊处理。 在Bash中,你可以使用间接引用数组: ```bash array_name="arr" arr=(a b c) echo ${!array_name[0]} # 这会出错,因为 ${!var} 用于标量 ``` 要间接引用数组元素,需要额外的技巧,如使用 nameref 或 eval。 所以,回答要准确:${!} 不直接支持数组引用,但有一些相关用法。 总结回答: 在Shell脚本中,${!} 语法(如 ${!var})主要用于间接引用变量,而不是直接用于数组。对于数组,Bash提供了 ${!array[@]} 来获取索引列表。因此,${!} 本身不能直接引用数组元素。 现在,对于相关问题,我需要提出3-5个问题,基于用户的问题和我的回答。 可能的 §§相关问题§§: 1. 在Bash中,如何使用 ${!array[@]} 获取数组索引? 2. 如何间接引用一个数组变量? 3. Shell中有哪些其他方式可以操作数组? 4. ${!prefix*} 和 ${!array[@]} 有什么区别? 5. 在Zsh或其他Shell中,${!} 的行为是否相同? 确保问题相关。 列出: 1. 在Bash中,${!array[@]} 的具体用法是什么? 2. 如何通过变量名间接访问数组元素? 3. 除了 ${!},Shell中还有哪些数组操作技巧? 4. ${!prefix*} 和 ${!array[@]} 的功能有何不同? 5. 在POSIX Shell中,数组支持如何? 现在,完整回答。</think>在Shell脚本中,${!} 语法本身不能直接用于引用数组元素。具体来说: - ${!} 单独使用是无效的语法,它必须与一个变量名结合使用,例如 ${!var},这表示间接引用(即引用变量名为 $var 的值的变量)。 - 对于数组,在Bash中,${!array_name[@]} 或 ${!array_name[*]} 可以用于获取数组的所有索引(键),但不能直接引用数组元素本身。 - 例如: ```bash arr=("apple" "banana" "cherry") echo ${!arr[@]} # 输出索引:0 1 2 ``` 如果尝试用 ${!var} 间接引用数组(如 `var="arr"; echo ${!var}`),它只会输出数组的第一个元素或引发错误,而不是完整引用数组。 总结:${!} 主要用于间接变量引用,而非数组操作;数组处理需使用专门的语法如 ${array[@]} 或 ${!array[@]}。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值