1、创建shell脚本文件
vim test.sh
2、shell脚本第一行
第一行需要写:#!/bin/bash
这一行( #!/bin/bash )其实并不是必不可少的,但是它可以保证此脚本会被我们指定的 Shell 执行。
3、给脚本文件添加可执行权限
查看权限:ls -l
添加可执行权限:chmod +x test.sh
4、shell语法
1、变量 aa="ceshi" 等号两遍一定不要加空格
2、echo显示内容
echo "hello world"
echo "hello $aa" 输出变量,切记不能用单引号,如果是单引号输出为 hello $aa
echo $aa 直接输出变量
3、read请求输入
1、read name
echo "姓名:$name"
2、带有输入提示的
read -p "请输入姓名:" name
echo "姓名:$name"
3、-n 限制字数
read -p "请输入姓名:" -n 10 name 限制10字节,超过会立即显示输出内容
4、-t显示输入时间
read -p "请输入姓名:" -t 30 name 限制30秒内输入,超时立即显示输出
5、-s隐藏输入内容
read -p "请输入密码:" -s password
4、数学运算
1、整数运算
let "a = 1"
let "b = 2"
let "c = a + b"
echo "c=$c"
2、小数计算bc
echo "scale=3;12.3/3"|bc
scale=3;保留三位小数
5、参数变量
$# :包含参数的数目
$0 :被运行的脚本的名称
$1 :第一个参数
$2:第二个参数.....
shift:移动参数
echo "这是第一个参数:$1"
shift
echo "这是新的第一个参数:$1" 此时的$1的值为第二个参数的值,依次往后推
6、数组
arr=('111' '222' '333' '444') 每一项中间用空格分隔,下标同样从0开始
arr[6]='666'
echo "数组第二项是:${arr[1]}"
echo ${arr[*]} 会输出数组的所有项
7、判断
1、if语句判断语句后面需要加;与then分隔,并且以fi结束,[]中间需要加空格
read -p "请输入姓名:" name
if [ $name = "qwer" ];
then
echo "hello $name"
elif [ $name = "asdf" ];
then
echo "name=$name"
else
echo "bye bye!"
fi
2、字符串判断
$string1 = $string2 : 两个字符串是否相等。Shell 大小写敏感,因此 A 和 a 是不一样的。
$string1 != $string2 : 两个字符串是否不同。
-z $string : 字符串 string 是否为空。
-n $string : 字符串 string 是否不为空。
3、数字判断
$num1 -eq $num2 : 两个数字是否相等。和判断字符串所用的符号( = )不一样。
$num1 -ne $num2 : 两个数字是否不同。
$num1 -lt $num2 : 数字 num1 是否小于 num2。
$num1 -le $num2 : 数字 num1 是否小于或等于 num2。
$num1 -gt $num2 : 数字 num1 是否大于 num2。
$num1 -ge $num2 : 数字 num1 是否大于或等于 num2。
4、判断文件
-e $file :文件是否存在。
-d $file : 文件是否是一个目录。因为 Linux 中一切都是文件,目录也是文件的一种。
-f $file : 文件是否是一个文件。
-L $file : 文件是否是一个符号链接文件。
-r $file : 文件是否可读。
-w $file : 文件是否可写。
-x $file : 文件是否可执行。
$file1 -nt $file2 : 文件 file1 是否比 file2 更新。
$file1 -ot $file2 : 文件 file1 是否比 file2 更旧。
5、测试多个条件
&&:逻辑与
||:逻辑或
!:非运算
示例:
1、
if [ $name = 'qwer' ] && [ -d $url1 ];
then
echo "name为qwer,文件1是目录"
fi
2、
if [ ! -e $url1 ];
then
echo "文件1不存在"
fi
6、测试多个条件case;case可以在匹配中做或匹配;示例如下:
case $userName in
"qwer" | "qw" | "er")
echo "用户名为qwer或qw或er"
;;
"asdf")
echo "用户名为asdf"
;;
"zxcv")
echo "用户名为zxcv"
;;
*)
echo "没有结果"
;;
esac
case $userName in :$userName 表示我们要测试的变量是输入的第一个参数。
"qwer") : 测试其中一个 case,也就是 $userName 是否等于 "qwer"。当然,我们也可以用星号来做通配符来匹配多个字符,例如 "q*") 可以匹配所有以 q 开头的字符串。
;; : 类似于主流编程语言中的 break;,表示结束 case 的读取,程序跳转到 esac 后面执行。
*) : 相当于 if 条件语句的 else,表示“否则”,就是“假如不等于上面任何一种情况”。
esac : case 的反写,表示 case 语句的结束。
8、循环
1、while循环
语法:
while [ 条件测试 ]
do
做某些事
done
示例:
while [ -z $userName ] && [ $userName != "asd" ]
do
read -p "请输入用户名:" userName
done
echo "用户名输入正确"
2、until循环
直到条件为真时才会结束循环
语法:
until [ $password = "123" ]
do
read -p "请输入密码:" -s password
done
echo "密码输入正确!"
3、for循环
示例1:
arr=("q" "w" "e" "r")
for item in ${arr[*]}
do
echo "输出:$item"
done
示例2:
for item in "a" "s" "d" "f"
do
echo "输出:$item"
done
示例3:
(ls *.sh linux命令,列出当前目录以.sh结尾的文件)
for file in `ls *.sh`
do
echo "输出文件:$file"
done
示例4:
seq命令用于产生从某个数到另外一个数之间的所有整数。
seq语法:
seq [选项]... 尾数
seq [选项]... 首数 尾数
seq [选项]... 首数 增量 尾数
选项:
-f, --format=格式 使用printf 样式的浮点格式
-s, --separator=字符串,
使用指定字符串分隔数字(默认使用:\n)
-w, --equal-width 在列前添加0 使得宽度相同
指定格式:
示例1:seq -f "%3g" 9 11
%后面指定数字的位数 默认是%g,%3g那么数字位数不足部分是空格。
输出:
9
10
11
示例2:seq -f "str%03g" 9 11
输出:
str009
str010
str011
示例3:seq -w 98 101
输出:
098
099
100
101
示例4:seq -s '=' 1 5
输出:
1=2=3=4=5
9、函数
定义函数:函数的完整定义必须放置在函数调用之前
方式1:
函数名 (){
函数体
}
注:函数名后面的括号里面不能放置任何参数
方式2:
function 函数名 {
函数体
}
示例1:
testFun(){
echo "this is function!"
}
testFun
传递参数:
跟shell脚本传递参数相同
示例2:
testFun(){
echo "这是第一个参数:$1"
echo "这是第二个参数:$2"
}
testFun "测试" hello
testFun 1 23
返回值:
test(){
return 1
}
a=$(test)
return 只能返回整型,不能返回字符串
返回字符串:
test1(){
local str="this is string"
echo "返回字符串:$str"
}
b=$(test1)
echo "返回值:$b"
变量作用范围:
默认变量都是全局变量(global)
创建局部变量:local local num1=12
重载命令:
ls(){
command ls -lh
}
ls
注意:如果没有 command 这个关键字(command 是英语“命令”的意思),那么程序会陷入无限循环。
如果你不小心忘了 command 关键字而陷入无限循环,可以用 Ctrl + c 的组合快捷键来停止程序。
5、linux命令
pwd:展示当前路径
ls:列出目录文件
cp:拷贝
rm:移除文件
-i 向用户确认是否删除
-f强制删除
-r递归删除
find:查找 find . -name "test.txt" (查找当前目录的test.txt文件)
cat:一次性展示文件的所有内容
用法:cat test.txt 显示行号:cat -n test.txt
less:分页显示文件内容
空格:显示下一页内容
回车:读取下一行内容
d:前进半页
b:后退一页
y:后退一行
u:后退半页
q:停止退出
head:显示文件开头(默认10行)
用法:head -n 20 test.txt (显示文件开头20行)
tail:显示文件结尾(默认10行)
用法:tail -n 20 test.txt (显示文件结尾20行)
touch:创建文件(同时创建多个后面跟多个文件名即可)
touch test2.txt
mkdir:创建目录
用法:mkdir ceshi
mkdir -p one/two/three (递归创建目录)
mv:移动文件或目录
用法:mv test.txt one (将test.txt 移动到one目录下面)
grep:筛选数据
用法:grep 123 test.txt 在test.txt文件中筛选123
-i:忽略大小写
-n:显示行号
-v:只显示文本不在的行
-r:在所有子文件和子目录里面查找
还可以匹配正则 grep -E ^123 test.txt 查找以123开头的行
sort:排序
-r:倒序排列
-R:随机排序
-n:对数字排序
wc:文件统计
wc test.txt 返回值依次为:行数 单词数 字节数
-l:统计行数
-w:统计单词数
-c:统计字节数
-m:统计字符数
uniq:删除文件中重复的内容(原文件不会改变,只是输出的会删除)
cut:剪切文件的一部分
-c:根据字符数剪切
cut -c 2-4 test.txt (test.txt 文件每行只保留第2到第4个字符)
-d:分割符(例如CSV文件 ,分割符被分为n列)
-f:区域(例如CSV文件,被分为n列后的某一列或某几列-f 1或-f 1,3或-f 2-或-f 2-5)
>和>>:重定向到文件
用法:cut -d , -f 2 test.csv > test1.txt (会覆盖源文件的内容)
cut -d , -f 2 test.csv >> test1.txt (会追加到源文件的末尾)
2>,2>>,2>&1:重定向错误输出
文件描述符 名字 解释
0 stdin 标准输入
1 stdout 标准输出
2 stderr 标准错误输出
示例1:
cat not_exist_file.csv > results.txt 2> errors.log
> results.txt :将标准输出重定向到 results.txt 文件中;
2> errors.log :将标准错误输出重定向到 errors.log 文件中。
示例2:
cat not_exist_file.csv > results.txt 2>&1
2>&1 :将标准错误输出重定向到与标准输出相同的地方。
示例3:
cat not_exist_file.csv >> results.txt 2>&1
将标准输出和标准错误输出都重定向到文件末尾,只需改前面的符号2>&1保持不变
<和<<从文件或键盘读取
cat < test.txt 从文件读取
wc -m << haha 从键盘读取,wc -m统计字符数,当键盘输入haha后结束
|管道,连接两个命令,命令1 | 命令2,命令1的输出->命令2的输入
用法:cut -d , -f 2 test.csv | sort >> test.txt
date:查看时间
ps:进程的静态列表
ps -ef 列出所有进程
ps -u qingclass 列出qingclass用户运行的进程
ps -aux 通过CPU和内存使用过滤进程
ps -aux --sort -pcpu 通过CPU使用率降序排列
ps -aux --sort -pmem 通过内存使用率降序排列
top:查看进程的动态列表
kill:结束进程
kill 1233 (1233为进程PID)
kill -9 1233 (强制结束进程)
&:在后台运行进程
control+z:暂停进程转到后台
bg:使进程转到后台
fg:使进程转到前台
fg 1 或者 fg %1 将编号为1 的进程转到前台