题目内容:
脚本可以带参数也可以不带,参数可以有多个,每个参数必须是一个目录,脚本检查参数个数,若等于0,则列出当前目录本身;否则,显示每个参数包含的子目录。
铭哥的脚本:我的测试:
从“ ls -l ${!a} |grep '^d'”看,${!a} 应该是传入的参数目录。但是测试结果:
因为$#会获取目录的个数,a=$i ,则使a 的值为一个数值,假使a=1;输出的${!a}为空。
使用ls命令测试;可以列出目录下的内容:但问题是无论 i循环时获取值为何,都是列出本目录下的目录与“ll”命令单独使用没有区别。。
但现实是,脚本可以正常运行,列出各个参数下的目录:修改脚本如下:
运行结果:目录没有改变问题:
这个${!a} 是数组的用法,还是变量的用法,还是其他特性??
脚本可以带参数也可以不带,参数可以有多个,每个参数必须是一个目录,脚本检查参数个数,若等于0,则列出当前目录本身;否则,显示每个参数包含的子目录。
铭哥的脚本:
- #!/bin/bash
- if [ $# == 0 ];then
- ls -ld `pwd`
- else
- for i in `seq 1 $#`
- do
- a=$i
- echo "ls ${!a}"
- ls -l ${!a} |grep '^d'
- done
- fi
从“ ls -l ${!a} |grep '^d'”看,${!a} 应该是传入的参数目录。但是测试结果:
因为$#会获取目录的个数,a=$i ,则使a 的值为一个数值,假使a=1;
- [root@master shell]# a=1
- [root@master shell]# echo ${!a}
- [root@master shell]# i=1;a=$i;echo ${!a}
使用ls命令测试;可以列出目录下的内容:
- [root@master shell]# i=1;a=$i;ll ${!a}
- 总用量 4
- -rw-r--r-- 1 root root 584 11月 23 16:37 1.sh
- -rw-r--r-- 1 root root 33 11月 23 21:16 1.txt
- -rw-r--r-- 1 root root 1546 11月 23 21:58 adduser.sh
- -rw-r--r-- 1 root root 12 11月 3 19:37 arg.txt
- [root@master shell]# i=2;a=$i;ll ${!a}
- 总用量 4
- -rw-r--r-- 1 root root 584 11月 23 16:37 1.sh
- -rw-r--r-- 1 root root 33 11月 23 21:16 1.txt
- -rw-r--r-- 1 root root 1546 11月 23 21:58 adduser.sh
- -rw-r--r-- 1 root root 12 11月 3 19:37 arg.txt
但现实是,脚本可以正常运行,列出各个参数下的目录:
- [root@master shell]# sh -x dir.sh /root /tmp
- + '[' 2 == 0 ']'
- ++ seq 1 2
- + for i in '`seq 1 $#`'
- + a=1
- + echo 'ls /root'
- ls /root ## 列出的是/root
- + ls -l /root
- + grep '^d'
- drwxr-xr-x 3 root root 4096 11月 3 21:14 jpg
- drwxr-xr-x 4 root root 4096 11月 18 19:33 patch
- drwxr-xr-x 2 root root 4096 11月 24 01:02 shell
- drwxr-xr-x 2 root root 4096 11月 20 11:12 test1
- drwxr-xr-x 2 root root 4096 11月 20 11:13 test2
- + for i in '`seq 1 $#`'
- + a=2
- + echo 'ls /tmp'
- ls /tmp ## 列出的是/tmp
- + ls -l /tmp
- + grep '^d'
- drwx------ 2 root root 4096 11月 19 04:06 ssh-eeIRD33261
- #!/bin/bash
- if [ $# == 0 ];then
- ls -ld `pwd`
- else
- pwd ## 进入循环前加入pwd 打印目录
- for i in `seq 1 $#`
- do
- pwd ## 循环内加入pwd 打印目录
- a=$i
- echo "ls ${!a}"
- ls -l ${!a} |grep '^d'
- done
- fi
- [root@master shell]# sh dir.sh /root /tmp
- /root/shell
- /root/shell ## /root/shell目录
- ls /root
- drwxr-xr-x 3 root root 4096 11月 3 21:14 jpg
- drwxr-xr-x 4 root root 4096 11月 18 19:33 patch
- drwxr-xr-x 2 root root 4096 11月 24 01:46 shell
- drwxr-xr-x 2 root root 4096 11月 20 11:12 test1
- drwxr-xr-x 2 root root 4096 11月 20 11:13 test2
- /root/shell ## /root/shell目录
- ls /tmp
- drwx------ 2 root root 4096 11月 19 04:06 ssh-eeIRD33261
这个${!a} 是数组的用法,还是变量的用法,还是其他特性??
0
测试过程中的其他问题:
赋一个变量,可以变量,可以数组。。
- [root@master shell]# a=(1 2 3)
- [root@master shell]# echo ${!a}
- [root@master shell]# echo ${a[*]}
- 1 2 3
- [root@master shell]# echo ${!a[*]} ## 为何这里数组的所有元素都减1
- 0 1 2
赋一个变量,可以变量,可以数组。。
- [root@master shell]# b=/root/shell
- [root@master shell]# echo ${b}
- /root/shell
- [root@master shell]# echo ${b[*]}
- /root/shell
- [root@master shell]# echo ${b[0]}
- /root/shell
- [root@master shell]# echo ${b[3]}
- [root@master shell]# echo ${#b}
- 11
- [root@master shell]# echo ${b:2}
- oot/shell
- [root@master shell]# echo ${b[*]:2}
- oot/shell
- [root@master shell]# echo ${b[*]:2}
- oot/shell
- [root@master shell]# echo ${b[*]:2:2}
- oo
- 这两个看不懂。。
- [root@master shell]# echo ${!b}
- [root@master shell]# echo ${!b[*]}
- 0
0
本帖最后由 xueyongbo 于 2015-12-10 20:38 编辑
来源:http://www.2cto.com/os/201310/248691.html
- shell中${}的妙用
-
- 1. 截断功能
- ${file#*/}: 拿掉第一条/及其左边的字符串:dir1/dir2/dir3/my.file.txt
- ${file##*/}: 拿掉最后一条/及其左边的字符串:my.file.txt
- ${file#*.}: 拿掉第一个.及其左边的字符串:file.txt
- ${file##*.}: 拿掉最后一个.及其左边的字符串:txt
- ${file%/*}: 拿掉最后条/及其右边的字符串:/dir1/dir2/dir3
- ${file%%/*}: 拿掉第一条/及其右边的字符串:(空值)
- ${file%.*}: 拿掉最后一个.及其右边的字符串:/dir1/dir2/dir3/my.file
- ${file%%.*}: 拿掉第一个.及其右边的字符串:/dir1/dir2/dir3/my
- 记忆的方法为:
- [list]#是去掉左边, ##最后一个
- %是去掉右边, %%第一个
- 单一符号是最小匹配﹔两个符号是最大匹配。
- 2. 字符串提取
- ${file:0:5}:提取最左边的 5 个字节:/dir1
- ${file:5:5}:提取第 5 个字节右边的连续 5 个字节:/dir2
- 3. 字符串替换
- ${file/dir/path}:将第一个 dir 提换为 path:/path1/dir2/dir3/my.file.txt
- ${file//dir/path}:将全部 dir 提换为 path:/path1/path2/path3/my.file.txt
- 4. 针对不同的变量状态赋值(没设定、空值、非空值):
- ${file-my.file.txt}: 若$file没有设定,则使用my.file.txt作返回值。(空值及非空值时不作处理)
- ${file:-my.file.txt}:若$file没有设定或为空值,则使用my.file.txt作返回值。(非空值时不作处理)
- ${file+my.file.txt}: 若$file设为空值或非空值,均使用my.file.txt作返回值。(没设定时不作处理)
- ${file:+my.file.txt}:若$file为非空值,则使用my.file.txt作返回值。(没设定及空值时不作处理)
- ${file=my.file.txt}: 若$file没设定,则使用my.file.txt作返回值,同时将$file 赋值为 my.file.txt。(空值及非空值时不作处理)
- ${file:=my.file.txt}:若$file没设定或为空值,则使用my.file.txt作返回值,同时将 $file 赋值为 my.file.txt。(非空值时不作处理)
- ${file?my.file.txt}: 若$file没设定,则将my.file.txt输出至 STDERR。(空值及非空值时不作处理)
- ${file:?my.file.txt}:若$file没设定或为空值,则将my.file.txt输出至STDERR。(非空值时不作处理)
- 注意:
- ":+"的情况是不包含空值的.
- ":-", ":="等只要有号就是包含空值(null).
- 5. 变量的长度
- ${#file}
- 6. 数组运算
- A=(a b c def)
- ${A[@]} 或 ${A[*]} 可得到 a b c def (全部组数)
- ${A[0]} 可得到 a (第一个组数),${A[1]} 则为第二个组数...
- ${#A[@]} 或 ${#A[*]} 可得到 4 (全部组数数量)
- ${#A[0]} 可得到 1 (即第一个组数(a)的长度),${#A[3]} 可得到 3 (第四个组数(def)的长度)
编辑回复