shell 既是脚本语言又是应用程序
查看自己linux系统的默认解析:echo $SHELL
创建第一个shell 文件
touch 01.sh
编辑
vi 01.sh
01.sh 文件内容
#!/bin/bash
echo 'felicia'
保存 按Esc 然后输入:wq
定义以开头:#!/bin/bash
#!用来声明脚本由什么shell解释,否则使用默认shell
添加文件可执行权限
chmod +x 01.sh
运行
三种执行方式 (./xxx.sh bash xxx.sh . xxx.sh)
./xxx.sh :先按照 文件中#!指定的解析器解析 指定解析器不存在 使用系统默认解析器
bash xxx.sh:指明先用bash解析器解析 bash不存在 才会使用默认解析器
. xxx.sh 默认解析器解析(不会执行第一行的#!指定的解析器)但是第一行还是要写的
变量
#!/bin/bash
echo 'felicia'
age=18
echo $age
#unset 清除变量
unset age
echo $age
read 接收输入的值
#!/bin/bash
age=18
echo "age=$age"
echo "请输入age的值"
read age
echo "age=$age"
read`命令的选项包括:
-d:指定输入行的结束标志。
-p:在输入前打印提示信息。
-e:允许在输入时使用命令补全功能。
-n:指定输入文本的长度。
-t:指定读取等待时间为指定的秒数。
-r:允许输入包含反斜杠。
-a:把输入行按空格分割并存入数组。
-p “text”:打印提示信息(text),等待输入,并将输入存储在变量中。
-d “:”:用冒号作为输入行的结束标志。
可以通过read --help
查看
read 读取多个数据 read age2 age3
read age2 age3
echo "age2=$age2"
echo "age3=$age3"
只读变量
readonly num=10
echo "num=$num"
num=18
echo "num=$num"
查看环境变量 env
aaa=19
#将aaa 设为系统变量
export aaa
#查找系统变量
env | grep aaa
#定义并设置系统变量
export bbb=22
env |grep bbb
ccc=23
#查找 用户变量和系统变量
set |grep ccc
echo:显示某个环境变量值
expor:设置一个新的环境变量
env:显示所有环境变量
unset:清除环境变量
set:显示本地定义的shell变量和环境变量
$0 当前执行的Shell脚本的文件名
$1-$9 当前Shell脚本的参数1-9
$# 当前Shell脚本的参数数量
$? 上一次执行的命令的退出状态
$* 所有当前Shell脚本的参数,作为一个单独的字符串
$@ 所有当前Shell脚本的参数,作为多个独立的字符串
$! 上一次在后台运行的任务的进程ID
$$ 当前Shell脚本的进程ID
$- 当前Shell使用的选项(标志)
$IFS Shell脚本中用于指定字段分隔符的值
#!/bin/bash
echo "Script name: $0"
echo $0
echo "第1个参数:$1"
echo "第2个参数:$2"
echo "参数个数:$#"
echo "所有参数:$*"
for i in "$*";do
echo $i
done
echo "所有参数:$@"
for i in "$@";do
echo $i
done
日期
#!/bin/bash
echo "当前日期`date`"
#echo "未来日期:`date -d +1 hour`"
date -d "+1 hour" +"%Y-%m-%d %H:%M:%s"
-e 转义
echo -e "###\n####"
()由子shell完成 子shell 不会影响当前shell 的值
#!/bin/bash
num=18
(
num=22
echo "()里num=$num"
)
echo “当前num=$num”
()由当前shell完成
#!/bin/bash
num=18
{
num=22
echo "()里num=$num"
}
echo “当前num=$num”
判断变量是否存在
#!/bin/bash
num=100
if [ -v num ];then
echo "变量存在"
else
echo "变量不存在"
fi
操作字符串
#!/bin/bash
str="felicia_jammy_lili"
echo "str长度${#str}"
#从下标为4的位置开始提取
echo ${str:4}
#从下标为4的位置提取长度为3字节
echo ${str:4:3}
#替换第一个出现的字符 ${str/旧字符/新字符}
echo ${str/_/:}
#替换所有字符 ${str//旧字符/新字符}
echo ${str//_/:}
文件测试运算符
-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]
-x file 检测文件是否可执行,如果是,则返回true。举例:[-x $file] 返回true
-s file 检测文件是否为空(文件大小是否大于0),不为空返回true。举例:[-s $file] 返回true
-e file 检测文件(包括目录)是否存在,如果是,则返回true,举例:[-e $file] 返回true
#!/bin/bash
read -p "请输入文件名" file_name
[ -e $file_name ]
echo $?
Shell还提供了与( -a , &&)、或( -o, || )、非( ! )三个逻辑操作符用于将测试条件连接起来,优先级从高到低依次为:”!”,”-a”,”-o”。
test -e是一个Shell内置命令,用于检查文件是否存在。如果文件存在,test -e命令返回0,表示真(true)。如果文件不存在,返回1,表示假(false)。
-e是test命令的一个参数,表示检查文件存在性。
-o是逻辑运算符,表示逻辑“或”。
#!/bin/bash
#检查011.sh文件是否存在,如果不存在,则检查./bash目录是否存在。
if test -e 011.sh -o -e ./bash
then
echo "至少有一个文件存在"
else
echo "两个都不存在"
fi
-d file 检查file是否存在 且为目录
-e file 检查file是否存在
-f file 检查file是否存在 且为文件
-r file 检查file是否存在 且可读
-s file 检查file是否存在 且非空
-w file 检查file是否存在 且可写
-x file 检查file是否存在 且可执行
-O file 检查file是否存在 且属当前用户所有
-G file 检查file是否存在 且默认组与当前用户相同
file1 -nt file2 检查file1是否比file2新
file1 -ot file2 检查file1是否比file2旧
if 控制语句
if [条件1]; then
执行第一段程序
elif [条件2];then
执行第二段程序
else
执行第三段程序
fi
#!/bin/bash
function wirte_text(){
echo "$1 即将写入内容"
cat>"$1"<< EOF
$2
EOF
echo "$1 内容写入成功"
}
read -p "请输入文件夹名称" dir_name
#获取当前路径
path=$(pwd)
if test -e $dir_name; then
echo "$dir_name 文件夹存在 即将进入该文件夹"
cd $dir_name
read -p "请输入文件名称" file_name
if test -e $file_name; then
echo "$file_name文件存在,即将读取文件内容"
echo $(cat $file_name)
else
echo "$file_name文件不存在 即将创建文件"
touch $file_name
echo "$file_name文件创建成功"
echo "$(ls)"
text='
你好
好久不见
'
wirte_text $file_name "$text"
fi
else
echo "$dir_name 文件夹不存在 即将创建"
mkdir $dir_name
echo "$dir_name 文件创建成功"
echo $(ls $path)
read -p "请输入文件名称" file_name
touch "$path/$dir_name/$file_name"
cd $path/$dir_name
echo $path/$dir_name
echo $(ls "$path/$dir_name")
text="你好
hi
"
echo "$text"
wirte_text $file_name "$text"
fi