常用命令

当前目录
CURRENT_DIR=$(cd $(dirname $0); pwd)
或
CURRENT_DIR=$(cd `dirname $0`; pwd)

dirname $0: 取得当前执行的脚本文件所在的目录;
cd: 进入当前工作目录;
pwd: 显示当前工作目录;
将当前工作目录输出给变量CURRENT_DIR。

上上级目录
`dirname $(dirname "$PWD")`

$()与``作用一样,用于shell命令的执行。
dirname: 显示最后一个结点前的路径;相对的,basename: 显示最后一个结点的名称。
$0: 脚本的路径名称,包含脚本本身的名称。

进程休眠3s
sleep 3s 睡眠3秒
sleep 3m 睡眠3分
sleep 3h 睡眠3小时

shell echo写入文件

 
echo aaa > ./a.log
echo -e "第一行\n第二行\n" > demo.txt

$ cat>a.log <<EOF
> 第一行
> 第二行
> EOF

<<EOF 表示遇EOF就结束 

shell算术运算

 
m1=`expr 7 % 3`
这里有三个空格,一个也不能少

shell条件判断

文件是否存在

    
文件是否存在 
if [ ! -f "./a.log" ];then
echo "文件不存在"
else
echo "文件存在"
fi

目录是否存在 
if [ ! -d "/data/" ];then
mkdir /data
else
echo "文件夹已经存在"
fi

 
#!/bin/bash
if [ -f './a.sh' ]; then
    echo "./a.sh存在"
fi 
if [ -f '../shell' ]; then
    echo "../shell存在"
fi 
if [ -f '../.msg' ]; then
    echo "../.msg存在"
fi 

-f 只能判断文件是否存在,不能判断目录
./表示上级目录,也是父目录
./a.sh表示当前父目录下的a.sh文件
../表示上上级目录

文件判断

 
if [ -f file ] 如果文件存在
if [ -d … ] 如果目录存在
if [ -s file ] 如果文件存在且非空
if [ -r file ] 如果文件存在且可读
if [ -w file ] 如果文件存在且可写
if [ -x file ] 如果文件存在且可执行


整数比较

 
if [ int1 -eq int2 ] 如果int1等于int2
if [ int1 -ne int2 ] 如果不等于
if [ int1 -ge int2 ] 如果>=
if [ int1 -gt int2 ] 如果>
if [ int1 -le int2 ] 如果<=
if [ int1 -lt int2 ] 如果< 

字符串判断

    
If [ $a = $b ] 如果string1等于string2
字符串允许使用赋值号做等号
if [ $string1 != $string2 ] 如果string1不等于string2

#!/bin/bash
string=""
if [ $string ]; then
    echo "string 有字符"
fi 
if [ -n $string ]; then
    echo "string 为空或不存在1"
fi 
if [ -z $string ]; then
    echo "string 为空或不存在2"
fi 
输出:
string 为空或不存在1
string 为空或不存在2



#!/bin/bash
if [ $string ]; then
    echo "string 有字符"
fi 
if [ -n $string ]; then
    echo "string 为空或不存在1"
fi 
if [ -z $string ]; then
    echo "string 为空或不存在2"
fi 
输出: 
string 为空或不存在1
string 为空或不存在2

-a到-z

 
[ -a FILE ] 如果 FILE 存在则为真。
[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。

[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。

[ -d FILE ] 如果 FILE 存在且是一个目录则为真。

[ -e FILE ] 如果 FILE 存在则为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。

[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。
[ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。

[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。 [

-p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。

[ -r FILE ] 如果 FILE 存在且是可读的则为真。

[ -s FILE ] 如果 FILE 存在且大小不为0则为真。
[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。

[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。

[ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。

[ -x FILE ] 如果 FILE 存在且是可执行的则为真。

[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。

[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。 [ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。
[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2,or 如果 FILE1 exists and FILE2 does not则为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。

[ -o OPTIONNAME ] 如果 shell选项 “OPTIONNAME” 开启则为真。

[ -z STRING ] “STRING” 的长度为零则为真。


 

    

分步执行,如果step=1,执行第一步,如果step=2,执行第2步

 
#!/bin/bash  

# 设置step的值,这里只是为了演示,你可以根据实际情况设置  
# 例如,你可以通过命令行参数、环境变量或用户输入来设置这个值  
step=1  # 你可以将这里的值更改为1或2来测试  
    
# 检查step的值并执行相应的步骤  
if [ $step -eq 1 ]; then  
    echo "执行第一步"  
    # 在这里插入你的第一步代码  
    # 例如: echo "这是第一步的具体操作"  
elif [ $step -eq 2 ]; then  
    echo "执行第二步"  
    # 在这里插入你的第二步代码  
    # 例如: echo "这是第二步的具体操作"  
else  
    echo "无效的step值: $step"  
fi
    

 

    

 


 

  

 


sed

删除第1行
sed -i "1d" jupyter
-i 表示保存

添加文本内文件的第1行
sed -i '1i添加的内容' filename # 在第一行前添加字符串 
sed -i "1i#\!/ai/app/anaconda3/bin/python" jupyter
[py39@pt1 tmp]$ cat jupyter 
#!/ai/app/anaconda3/bin/python

# -*- coding: utf-8 -*-


全局替换
sed -i 's/ssid.*/ssid=6/g' test.sh

split拆分文件

 
按大小拆分
split -b 5M file1 
xaa 
xab 

合并:要求写入的名称与原来拆分的原文件名称一致
cat x* > file1 

 
split -b 180M jupyter.tar.gz 

vim readme.txt 
cat x* > jupyter.tar.gz 

tar命令

ubantu下压缩

 
tar -zcvf a.tar.gz a 
    
压缩后,可能出现损失,如果很重要,或者要交给其他人处理,最后自己先解压一下试试

 

    

 


 

  

 


vim

右键无法粘贴

 
右键无法粘贴,而是变成区域选择
    

解决办法

 
~# vim .vimrc
"设置鼠标可用
set mouse-=a
    

 
原来是set mouse=a
改为set mouse-=a
    

 

    

 

    

 


 

  

 


参考文章
sed sed shell -f 等条件判断含义解释