Linux命令书籍:https://www.linuxprobe.com/chapter-00.html
shell参考:http://www.runoob.com/linux/linux-shell.html
1、一个hello world
例子:hello.sh
#!/bin/bash
echo "Hello World !"
解释:
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo 命令用于向窗口输出文本。
执行:
Sh hello.sh
./hello.sh
要用 ./test.sh 告诉系统说,就在当前目录找,否则会在path中查找。
- 数组
定义:array_name=(value0 value1 value2 value3)
读取:${数组名[下标]}
valuen=${array_name[n]}
例题:
#定义数组
names=("tom" "jack" "green")
#打印数组的一个元素
echo ${names[1]}
#打印数组的所有元素
echo ${names[@]}
#打印数组长度
echo ${#names[@]}
#打印数组长度
echo ${#names[*]}
#打印某一个数组元素长度
echo ${#names[2]}
- 截取的八种用法
Linux 的字符串截取很有用。有八种方法。
假设有变量 var=http://www.aaa.com/123.htm
1. # 号截取,删除左边字符,保留右边字符。
echo ${var#*//}
其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符
即删除 http://
结果是 :www.aaa.com/123.htm
2. ## 号截取,删除左边字符,保留右边字符。
echo ${var##*/}
##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
即删除 http://www.aaa.com/
结果是 123.htm
3. %号截取,删除右边字符,保留左边字符
echo ${var%/*}
%/* 表示从右边开始,删除第一个 / 号及右边的字符
结果是:http://www.aaa.com
4. %% 号截取,删除右边字符,保留左边字符
echo ${var%%/*}
%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
结果是:http:
5. 从左边第几个字符开始,及字符的个数
echo ${var:0:5}
其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:
6. 从左边第几个字符开始,一直到结束。
echo ${var:7}
其中的 7 表示左边第8个字符开始,一直到结束。
结果是 :www.aaa.com/123.htm
7. 从右边第几个字符开始,及字符的个数
echo ${var:0-7:3}
其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
结果是:123
8. 从右边第几个字符开始,一直到结束。
echo ${var:0-7}
表示从右边第七个字符开始,一直到结束。
结果是:123.htm
注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)
- 向脚本传递参数
向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,其中 $0 为执行的文件名,$1 为执行脚本的第一个参数,$2 为执行脚本的第二个参数,以此类推……
- 运算符
val=`expr 2 + 2`
echo "两数之和为 : $val"
1、表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
2、完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
3、条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
4、乘号(*)前边必须加反斜杠(\)才能实现乘法运算;
5、在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 "*" 不需要转义符号 "\" 。
解释:
EQ 就是 EQUAL等于
NQ 就是 NOT EQUAL不等于
GT 就是 GREATER THAN大于
LT 就是 LESS THAN小于
GE 就是 GREATER THAN OR EQUAL 大于等于
LE 就是 LESS THAN OR EQUAL 小于等于
例:if [[ $a -lt 100 && $b -gt 100 ]]
6、文件的判断
file="/var/www/runoob/test.sh"
if [ -r $file ]then
echo "文件可读"else
echo "文件不可读"fi
if [ -w $file ]then
echo "文件可写"else
echo "文件不可写"fi
if [ -x $file ]then
echo "文件可执行"else
echo "文件不可执行"fi
if [ -f $file ]then
echo "文件为普通文件"else
echo "文件为特殊文件"fi
if [ -d $file ]then
echo "文件是个目录"else
echo "文件不是个目录"fi
if [ -s $file ]then
echo "文件不为空"else
echo "文件为空"fi
if [ -e $file ]then
echo "文件存在"else
echo "文件不存在"fi
- 输出
1、echo
echo `date`
注意: 这里使用的是反引号 `, 而不是单引号 ',结果将显示当前日期
Thu Jul 24 10:08:46 CST 2014
- Printf
printf 使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认printf不会像 echo 自动添加换行符,我们可以手动添加 \n。
脚本:printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
结果:郭靖 男 66.12
解释:%s %c %d %f都是格式替代符,%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中.2指保留2位小数。
创建50个目录,并设置对应的权限
#!/bin/bash
if [ ! -d "/tmp/test" ];then
mkdir "/tmp/test"
fi
cd /tmp/test
for m in $(seq 50)
do
mkdir test$m
done
chmod 175 test*