Linux命令
权限相关常用
- chown:修改组
-
处理目录的常用命令
ls(英文全拼:list files): 列出目录及文件名
- 只列出来文件夹:
ls -F |grep "/$"
- 只列出来文件夹:
cd(英文全拼:change directory):切换目录
- pwd(英文全拼:print work directory):显示目前的目录
- mkdir(英文全拼:make directory):创建一个新的目录
- rmdir(英文全拼:remove directory):删除一个空的目录
- cp(英文全拼:copy file): 复制文件或目录
- rm(英文全拼:remove): 移除文件或目录
mv(英文全拼:move file): 移动文件与目录,或修改文件与目录的名称
磁盘相关命令
df:列出文件系统的整体磁盘使用量
- df [-ahikHTm] [目录或文件名]
- du:检查磁盘空间使用量
du [-ahskm] [文件或目录名称]
$ du -h -d1
# 查看当前目录的大小,只看一级,d后面如果是2就看二级,-h 提高可读性(以K/M/G)为单位
VIM编辑
最常见的
i:开始输入字符
:wq! 强制保存并退出编辑
:set nu 展示行号
批量替换:
:100,200s/vbird/VBIRD/g :100~200行中间所有的vbird替换为VBIRD
:1,$s/word1/word2/g: 从第一行到最后所有的vbird替换为VBIRD
其他命令参考
https://www.runoob.com/linux/linux-vim.htmlSHELL
变量
定义变量
your_name="dachun.wang"
注意点:变量名和等号之间不能有空格
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
- 除了显式地直接赋值,还可以用语句给变量赋值,如:
使用变量# 打印etc目录下所有文件的文件名
for file in `ls /etc` then; do echo $file; done
#或
for file in $(ls /etc) then; do echo $file; done
使用一个定义过的变量,只要在变量名前面加美元符号即可
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界echo $your_name
#或者
echo ${your_name}
**
如果不给skill变量加花括号,写成echo “I am good at $skillScript”,解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。for skill in Ada Coffe Action Java; do
echo "I am good at ${skill}Script"
done
删除变量unset variable_name
字符串
字符串可以用单引号,也可以用双引号
**
单引号字符串的限制:str='this is a string'
str="this is a string"
- 单引号里的任何字符都会原样输出,**单引号字符串中的变量是无效**的;
双引号的优点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
输出:your_name="abc"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
获取字符串长度hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !
字符串截取string="abcd"
echo ${#string} #输出 4
注意:index从0开始string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
字符串查找
查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
string="runoob is a great site"
echo `expr index "$string" io` # 输出 4
数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
#方式1
array_name=(value0 value1 value2 value3)
#方式2
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
读取数组
# ${数组名[下标]}
echo ${array_name[0]} #输出value0
# 不带坐标,返回第0个
echo ${array_name} #输出value0
# 输出所有元素
echo ${array_name[@]} #输出value0 value1 value2 value3
# 查询数组长度
echo ${#array_name[@]} 输出4
注意:数组必须带{},否则识别不了
echo $array_name[0] #输出 value0[0]
传参
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
echo "Shell 传递参数实例!"
echo "执行的文件名:$0"
echo "第一个参数为:$1"
echo "第二个参数为:$2"
echo "第三个参数为:$3"
echo "参数个数为:$#"
输出
$ chmod +x test.sh
$ ./test.sh 1 2 3
Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3
参数个数为:3
$? 代表脚本是否正确执行,可用于做逻辑判断
$ 和 $@的区别:$是一个参数。¥@是每个参数
echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
done
# 返回 1 2 3
echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done
# 返回
# 1
# 2
# 3
算数运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
$ echo 2+2
#输出:2+2
$ echo `expr 2+2`
#输出:2+2
$ echo `expr 2 + 2`
#输出:4
$ expr 2 + 2
#输出:4
expr
- 仅对整数有效
- 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样
关系运算符
布尔运算符
逻辑运算符
字符串运算符
文件测试运算符
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] 返回 false。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回 false。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
echo:支持变量、转义字符、支持输出字符到其他文件
#!/bin/sh
# -e 开启转义
echo -e "OK! \n"
echo "It is a test"
# -e 开启转义 \c 不换行
echo -e "OK! \c" #
echo "It is a test"
#字符输出到myfile中
echo "It is a test" > myfile
#显示命令执行结果
echo `date`
printf: printf format-string [arguments…]
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
结果
说明:
%s %c %d %f都是格式替代符
%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中.2指保留2位小数。
注意:
printf 不会自带换行
printf 单引号也会被替换
printf 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf "%s and %d \n"
# 返回
and 0
printf %s abc def
# 返回
abcdef
test:Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
输出结果
两个数相等!
流程控制
IF
# 标准形式
if condition
then
command1
...
commandN
fi
# 单行形式,语句之间要加;
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
# if else
if condition
then
command1
...
commandN
else
command
fi
# if else-if else
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
# demo
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
# 输出:a 小于 b
# 结合test
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
echo '两个数字相等!'
else
echo '两个数字不相等!'
fi
FOR
# 多行模式
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
# 单行模式
for var in item1 item2 ... itemN; do command1; command2… done;
# demo
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
CASE
取值后面必须为单词in,每一模式必须以**右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;**。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
case 值 in
模式1)
command1
command2
command3
;;
模式2)
command1
command2
;;
*)
command1
command2
;;
esac
#!/bin/sh
site="runoob"
case "$site" in
"runoob")
echo "菜鸟教程"
;;
"google")
echo "Google 搜索"
;;
"taobao")
echo "淘宝网"
;;
esac
其他流程还有 while | until,一般都可以用for循环替代。
循环停止语句 break | continue ,和其他语言的概念无区别
函数
无参数,无返回值
#!/bin/bash
demoFun(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
带返回值函数
#!/bin/bash
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return `expr $aNum + $anotherNum`
}
funWithReturn
echo "输入的两个数字之和为 $? !"
参数传递
#!/bin/bash
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
输出/输入
- command > file 将输出重定向到 file。
- command < file 将输入重定向到 file。
- command >> file 将输出以追加的方式重定向到 file。
基本功能参考:https://www.runoob.com/linux/linux-tutorial.html
各种括号、引号使用的参考:https://blog.csdn.net/taiyang1987912/article/details/39551385