shell
Posted tujw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell相关的知识,希望对你有一定的参考价值。
当前目录所有目录中的文件
ls -R
显示目录和文件,目录后带/
ls -F
递归复制整个文件夹
cp -R
重命名文件
mv node.sh note.sh
硬连接会保留数据,软连接会直接无效
cp -l # 硬连接
cp -s # 软连接
创建目录
mkdir dir
查看文件内容 -n所有行号 -b带文本的行号
cat
其他查看文件的方法
more less
显示开头和结尾 可以带 -n 显示n行
head tail
显示进程
ps
实时进程控制
top
停止进程
kill
查看磁盘空间 -c 显示总用量 -h 以可读形式显示
df
对文件内容进行排序 -n 数字识别为数字 -M 按月份排序
sort file -n
查看全局变量
printenv
设置本地变量,然后导出,就可以变为全局变量
导出后不用再使用$符号
var=100
export var
删除环境变量
unset var
定义数组
myArr=(1 2 3 4)
通用显示
echo ${myArr[0]}
只能显示第一个
echo $myArr
显示所有数据
echo ${myArr[*]}
unset 对数组也有效
查看别名
alias -p
创建别名
alias vim=‘vi‘
用户操作
useradd usermod userdel
修改权限 u 表示用户 o 表示其他任何人
g 表示用户组 a 表示所有
+ 表示增加权限 - 相反
x 表示执行权限 chmod u+x file
上述命令表示给文件增加执行权限
chmod
开始创建脚本
!/bin/bash
执行该 echo 后不换行
echo -n
时间
date
用户
who
不管文件村不存在,都覆盖
data > file
>> 在末尾添加
wc 文本的行数,文本的单词数,文本的字节数
管道符 ,将输出重定向到另一个命令
|
运算,$[],在方括号中进行
a=10
b=20
c=$[a+b]
echo c
bc bash计算器
-q 去掉欢迎 scale 设置小数位数
bc
浮点数运算,一定要用双引号,外面用1左边的引号
a=100.1
b=150
c=echo "scale=4; $a / $b" | bc
echo $c
内置输入重定向
result=bc << EOF scale=10 a=100 b=2300 a/b EOF
查看退出状态码
echo $?
手动修改状态码
exit 10
结构化命令,如果if后的命令执行返回0
那么执行then后面的语句
if date
then
echo "It‘s worked"
fi
可以在then语句块后加else
elif 多分支语句
if 条件中可以写这个,
和普通就一样了
需要注意的是要和[ 空格分开 ]
-eq 相等
-ge 大于等于
-gt 大于
-le 小于等于
-lt 小于
-ne 不等于
test不能处理浮点数
[ 1 -eq 2 ]
测试 test
test condition
字符串比较 = != < > -n -z
-n 长度是否大于0
-z 是否长度为0
比较时要注意要用转译符转译
字符串比较 -n "$str"
后面一定要加"",否则会出错
-d 是否是目录
-e 是否存在
-f 是否存在且是一个文件
-r 是否存在且可读
-s 是否存在且不为空
-w 是否存在且可写
-x 是否存在且可执行
-O 是否被当前用户拥有
-G 默认组是否为当前用户组
file1是否比fil2新
file1 -nt file2
-ot 旧
if 后面可以加 && ||
(())中可以执行个一些较高级的操作
里面符号也不需要转译
((a++)) ((a=!a))
[[]]内可以使用正则表达式去匹配
对前面的变量进行匹配
me=tujiawei
if [[ $me == t* ]]
then
echo $me
else
echo no
fi
case 命令
case $var in
var1 | var3)
echo $var;;
var2)
echo $var;;
*)
echo 这是默认;;
esac
for循环
for i in list
do
echo commands
done
赋值
list=‘123123‘
list=$list"456"
echo list
internal field separator 内部字段分隔符
下面的意思是只识别换行符和空格
IFS=$‘ ‘
如果只有单个 可以
IFS=:
linux中文件名带空格是合法的
在使用时最好用""包裹
类似c的for
for ((i=1,j=10; i<=10; i++, j--))
do
echo next number is $i - $j
done
while 循环
只有最后一条测试命令的退出状态
是用来决定循环何时停止的
cnt=10
while [ $cnt -gt 0 ]
do
echo $cnt
((cnt--))
done
while 可以写多个条件
每个条件要换行
只有最后一条测试的退出状态是有效的
until 与 while 相反
只有最后一条测试命令的退出状态非0才执行
break continue
在 done 后面可以加 > 将结果输出 >>
还可以将循环的输出管道传送给其他命令
$0 为程序名
$1 - $9 为程序的参数
超过9以后,需要使用 ${10} .. ${11}
basename 返回名称,不带路径
$# 输入参数的个数
${!#} 获取最后一个输入的参数,不能用 ${$#}
$* $@ 将所有参数作为一个字符串
shift 将参数左移, 后面可以加数字, 左移n位
getopt 接受选项和参数列表
后接选项,如 abc
如果选项需要参数,就在选项后加个:
如 a: ,表示 -a 后面需要加参数
set -- 将命令行参数替换为 -- 后面的值
set -- getopt ab:cd "$@"
拆分命令行参数,并修改命令行参数
getopt ab:cd "$@" 将命令行参数变为单独的
如 -ab 变为 -a -b
这种方法会将双引号中带空格的一个命令拆分为多个
处理参数
??c 第一个:表示禁止警告信息
当没有在??c中出现时,会将选项变成?
如果不是以-开头会停止解析
while getopts ??c opt
do
case "$opt" in
a)
echo "Found the -a option" ;;
b)
echo "Found the -b option, with value $OPTARG" ;;
*)
echo "Unknow option : $opt" ;;
esac
done
最后停止的位置
$OPTIND
选项的参数
$OPTAGR
-a 显示所有对象
-c 生成计数
-d 指定目录
-e 展开对象
-f 制定读取数据的文件
-h 显示帮助
-i 忽略大小写
-l 生成长格式输出
-n 非交互式模式
-o 指定输出文件
-q quiet模式执行
-r -r 递归处理目录和文件
-s 以silent模式执行
-v 生成verbose输出
-x 排除和拒绝
-y 设置所有提问的回答为yes
读取用户输入
read var
echo -n 抑制换行
输入提示, 可以输入多个
如果不指定变量,会放在 $REPLY
read -p "请输入姓名:" name age
在read 后加 -t n 定时
read -t 5
5秒后自动结束 , 返回一个非0退出状态
read -n1 只接受一个字符
-s 让输入不显示
read 按行读文件
count=1
cat test | while read line
do
echo "Line $count: $line"
count=$[ $count + 1 ]
done
echo "Finished processing the file"
ls -al badfile 2> test1
2>表示输出错误信息
STDIN 0
STDOUT 1
STDERR 2
&> 将普通信息和错误信息输出到同一个文件中
默认情况下,Linux将 STDOUT输出定向到STDOUT
>&2 在脚本中重定向输出
正常运行不会有效果,只有运行脚本时,加上 2> 才会有效果
永久重定向
将所有STDOUT重定向到 file
exec 1>file
把3重定向到监视器
把1重定向到文件
结束以后把1改回到监视器
exec 3>&1
exec 1>output
exec 1>&3
改输入时使用 <
关闭文件描述符 , 重定向到 -
3>&-
禁止命令输出
/dev/null
mktemp 在/tmp 目录创建临时目录
生成随即字符, 一定要大写X
mktemp test.XXXXXX
mktemp -t 强制创建临时文件,并返回全路径
-d 强制创建临时目录,并返回全路径
同时发送给 监视器 日志文件
每次写都会覆盖之前的内容
若想添加, -a
tee file
date | tee -a file
SIGHUP 刮起进程
SIGINT 中断进程
SIGQUIT 停止进程
SIGKILL 无条件终止进程
SIGTERM 如果可能的话终止进程
SIGSTOP 无条件停止
SIGTSTP 停止或暂停
SIGCONT 重新启动停止进程
sleep n 暂停n秒
ctrl+z 暂停进程
当接受到信号时 执行trap 后面的命令
下面的命令表示要中断进程时 显示Haha
trap "echo Haha" SIGINT SIGTERM
trap "Bye-bye" EXIT
trap - EXIT 移除捕获
在后台运行 ./demo.sh &
在后面加一个 & 就可以
防止退出中断时退出进程
nohup ./demo.sh &
$$表示分配给作业的PID
jobs # 显示作业
-l 进程的PID和作业编号
-n 仅列出自上一次shell通知以来已经更改了作业的状态
-p 只显示PID
-r 只显示运行的作业
-s 只显示停止的作业
- 为默认作业
- 为处理完当前默认作业之后将成为默认作业
只会有一个 + 和 -
bg n 后台模式重新启动作业
fg n 前台模式重新启动作业
前台模式下无法使用命令行
优先级为10运行该脚本
-20 ~ 20 其中-20优先级最高
只能将优先级变小,不能增加
nice -n 10 ./demo.sh > test &
renice 更改系统中运行的命令优先级
renice 10 -p PID号
指定时间运行脚本
at [-f filename] time
time 可以用 Now, Now + n minutes, 10:20, 10:20PM
MMDDYY MM/DD/YY 或 DD.MM.YY
-q 指定优先级 a最高 z最低
atq 查看作业队列
atrm 移除作业
batch 如果平均负载低于0.8
运行等待的作业
与at类似
batch -f file time
min hour dayofmonth month dayofweek command
不想写可以用 * 号代替
anacron 能将错误运行时间的命令尽快运行
period delay identifier command
多久运行一次 确定运行后,需多长时间才会实际运行
唯一标识日志消息和错误消息
function name {
commands
}
name() {
}
name
可以使用return 0 ~ 255
在函数内部使用echo 返回给result
result = funcname
可以返回浮点数 和 字符串
函数就是一个小脚本,所以脚本的 $0 ~ $9 同样适用
func 10 20
local 函数内部定义局部变量
local a=1
est ${arr[*]} 传递数组
. /home/function
运行库文件脚本,可以使用相对路径
可以在 .bashrc 文件中定义函数
echo -e " " 可以输出不可打印的字符
选项菜单 其中 hello greet bye 都是函数
PS3="Enter option:"
select option in "hello" "greet" "exit"
do
case $option in
"hello")
hello ;;
"greet")
greet ;;
"exit")
bye
break ;;
esac
done
控制序列指示器
CSI
选择图形再现
SGR
CSIN[;k]m
普通
强亮
弱亮
斜体
下划线
慢闪烁
快闪烁
背景/前景色反转
将前景色改为背景色
黑色
红色
绿色
黄色
蓝色
洋红
青色
白色
CSI用 33代替
echo -e "