# 标准开头 通常是bash
#!/bin/bash
# 此处可写脚本功能注释
# 定义变量 =两边不要加空格 变量名不能以数字开头 变量值如果有空格需要用引号包裹或用\转义
LOG_DIR=/var/log
name = BestLove //错误,不能空格
name=Best Love //错误,不能空格
1name=BestLove //错误,不能数字开头
name=BestLove //正确
//name=BestLove's name //错误,引号必须成对出现
name="BestLove's name" //正确
name=BestLove\'s\ name //正确,转义了'和空格
name=$namehaha //错误,不是拼接haha了
name="$name"haha //正确
name=${name}haha //正确
name=BestLove //定义变量名
bash //进入子程序
echo $name //输出为空,子程序外定义的变量在子程序中无法获取
exit //退出子程序
export name //将变量设为环境变量
bash //进入子程序
echo $name //输出了BestLove
exit //退出子程序
unset name //释放变量
//使用反引号或$()可以实现指令嵌套 uname -r会被执行,获取核心版本号
cd /lib/modules/`uname -r`/kernel
cd /lib/modules/$(uname -r)/kernel
//使用env或export能查看环境变量
HOME //用户目录和~差不多
SHELL //当前环境使用的是哪个shell,默认一般是/bin/bash
PATH //执行文件的搜索路径
LANG //编码格式
RANDOM //随机数0-32767
//locale查看linux支持的编码格式
//定义数字类型number为0-9 declare [-aixr] variable -a:array -i:int -x:export -r:readonly
// declare -p 变量名 可以查看变量的类型 declare +x 变量名 可以取消-的操作
declare -i number=$RANDOM*10/32768;
echo $number
//数组也可以用中括号来定义
test[1]=aaa test[2]=bbb
echo "${test[1]},${test[2]}"
//$本身也是个变量,表示本shell的PID
echo $$
//?关于上个指令的回传值 0表示成功 非0一般是错误码
echo $?
//获取键盘输入,赋值给变量 read [-pt] variable -p后面可以接提示字符 -t后面接等待秒数
read -p "请输入yes or no,10秒后不输入默认为yes:" -t 10 flag
echo $flag
//ulimit [-SHacdfltun] [配额] 重启需要重写设定
//-H hard limit 严格的设定,必定不能超过这个值
//-S soft limit 警告的设定,如果超过这个值会有警告。通常soft比hard小一点 比如sort设80,hard设100
//-a 后面不接任何选项与参数,可列出所有的限制额度
//-c 当某些程序发生错误时,系统可能会将该程序在内存中的信息写成档案,这种档案就被称为核心档案(core)。此为限制每个核心档案的最大容量
//-f 此shell可以建立的最大档案容量(一般可能设定为2GB)单位为Kbytes
//-d 程序可使用的最大断裂内存容量
//-l 可用于锁定(lock)的内存量
//-t 可使用的最大cpu时间(单位为秒)
//-u 单一用户可以使用的最大程序数量
//-n 最大允许连接数
# echo $a会删除ls结果中多余的tab和换行 echo "$a"会保留ls结果中的tab和换行
a=`ls -al`
echo $a
echo "$a"
# a+=1会输出字符串拼接 let a+=1会相加
a=1
a+=1
let a+=1
echo $a
# 将1122替换成55
a=11223344
b=${a/1122/55}
echo $b
# 使用变量 $变量名
cd $LOG_DIR
# 清空/var/log/message
cat /dev/null > message
# 输出执行脚本的信息
echo "ok"
# 标准退出
exit
ROOT_UID=0 # $UID=0时,用户才有root权限
E_NOTROOT=67 # 非root用户将以error退出
# 如果用户不是系统用户 输出信息 退出
if [ "$UID" -ne "$ROOT_UID" ]
then
echo "mush be root"
exit $E_NOTROOT
fi
# 如果不换行 需要使用;
if [ xxx ]; then
# case选项需要双分号;;
case "$variable" in
abc) echo "\$variable = abc" ;;
xyz) echo "\$variable = xyz" ;;
esac
# 逗号链接了一系列的算术操作,虽然里面的所有内容都被运行,但只有最后一项被返回
1 let "t2 = ((a = 9, 15 / 3))" # Set "a = 9" and "t2 = 15 / 3"
# :内建命令(一个什么也不干的命令) 也可以被认为与shell的内建命令true作用相同
while :
do
...
done
while true
do
...
done
if xxx
then : #什么也不做,引出分支
elif xxx
then
...
else
...
fi
# :> 可以把文件清空 如果文件不存在,创建这个文件
# 与 cat /dev/null > test.log 作用相同 但它不会产生一个新的进程 因为:是内建命令
:> test.log
# : 还能作为占位符和分隔符
: ${username=`whoareyou`}
/usr/local/bin:/bin:/usr/bin
# !取反
# *通配符 算术操作符(乘) **求幂运算
# ?双括号中作为三元操作符 参数替换中测试变量是否被set 正则中通配一个字符
# $引用变量 正则结束符 ${}参数替换 $* $@位置参数 $?退出状态码变量,保存一个命令、一个函数或者脚本本身的退出状态码
# $$进程ID变量,保存它所在脚本的进程ID
# $1第一个参数 $2第2个参数 ... $0获取脚本名称
# ()命令组(a=hello;echo $a),在括号中的命令作为一个子shell来运行,括号中的变量是局部变量,只能在括号(子进程)中使用
# array=(a b c)初始化数组 echo ${array[1]}会输出b
# 把file1 file2 file3连接到一起,并重定向到combined_file中
cat {file1,file2,file3} > combined_file
# 拷贝file.txt到file.bak {}中不允许有空白,除非被\ '' "" 转义或引用
cp file.{txt,bak}
# {}中的变量在外部是可以用的
#!/bin/bash
# 读取test.php中的行
FILE=/home/wwwroot/default/test.php
{
read line1
read line2
} < $FILE
echo $line1
echo $line2
exit 0
# > &> >& >> < <> >| 重定向 >覆盖 >>追加 &>重定向stdout和stderr >&2重定向stdout到stderr >|强制重定向
# shift命令 逐步获取所有的位置参数 $1 $2 $3 ...
#!/bin/bash
# until循环和while相反 while是false出循环 until是true出循环
until [ -z "$1" ] #直到所有的位置参数都被存取完
do
echo -n "$1 " #-n表示不要在最后自动换行
shift
done
echo #输出额外的换行
exit 0
//#从变量最左边往右删除,是懒惰匹配的,可以使用*通配符 %是最右边往左边删除 ##和%%是贪婪匹配 输出cccdddbbboooooooooooooo
test=aaabbbcccdddbbboooooooooooooo
test=${test#*bbb}
echo $test
//同样以test变量为例,/表示懒惰替换 //表示贪婪替换 输出aaaBBBcccdddbbboooooooooooooo
test=aaabbbcccdddbbboooooooooooooo
test=${test/bbb/BBB}
echo $test
// - :- + :+ = := ? :?
变量设定方式 str没有设定 str为空字符串 str已设定为非空字符串
var=${str-expr} var=expr var= var=$str
var=${str:-expr} var=expr var=expr var=$str
var=${str+expr} var= var=expr var=expr
var=${str:+expr} var= var= var=expr
var=${str=expr} str=expr str不变 str不变
var=expr var= var=$str
var=${str:=expr} str=expr str=expr str不变
var=expr var=expr var=$str
var=${str?expr} expr输出至stderr var= var=$str
var=${str:?expr} expr输出至stderr expr输出至stderr var=$str
// type -a command 可以了解命令的搜索顺序 通常顺序为 /bin/ls或./ls -> 通过alias找 -> 由bash内建的指令执行 -> 通过$PATH找
type -a ls
// 重启保留的bash需要写入配置文件 login shell和non-login shell的配置文件不同
// login shell
//整体的配置,最好不要改 /etc/profile还会读很多其他配置
/etc/profile
//属于使用者个人设定 只会读取以下三个中的一个,顺序是从上往下 个人设定会累加整体配置
~/.bash_profile
~/.bash_login
~/.profile
// source或.命令会使写入配置文件的内容立即生效(不重启) ~/.bashrc是non-login shell会读的配置文件
source ~/.bashrc
. ~/.bashrc
// stty -a 查看所有的快捷键 ^表示ctrl 例如:默认intr = ^C stty intr ^X 就可以设置成ctrl+x中断了
// 显示目前所有的set设定值
echo $-
// set [-uvCHhmBx] 例如:set -u echo $undefined会显示错误信息 set +u可以取消设定
// -u :预设不启用。若启用后,当使用未设定变量时,会显示错误信息;
// -v :预设不启用。若启用后,在信息被输出前,会先显示信息的原始内容;
// -x :预设不启用。若启用后,在指令被执行前,会显示指令内容(前面有 ++ 符号)
// -h :预设启用。与历史命令有关;
// -H :预设启用。与历史命令有关;
// -m :预设启用。与工作管理有关;
// -B :预设启用。与刮号[]的作用有关;
// -C :预设不启用。若使用>等,则若档案存在时,该档案不会被覆盖。
//标准输入(stdin):代码为0,使用<或<<
//标准输出(stdout):代码为1,使用>或>>
//标准错误输出(stderr):代码为2,使用2>或2>>
//执行test.php /dev/null类似windows回收站 第一个>表示把正确输出丢弃到回收站 2>&1或&>表示把错误输出指向正确输出一起丢弃
php test.php > /dev/null 2>&1
//把2.log的内容追加到1.log
cat >> 1.log < 2.log
// << 类似于php中的界定符
// cat >> 1.log << 2.log
// > 此时不会把2.log的内容写进1.log
// > 我可以一直写
// > 直到再次碰到2.log才会中止
// > 2.log
// 一次执行多个指令 ; && || |
sync;sync;shutdown -h now
// 如果第一个命令执行成功 $?=0 则执行第2个命令 反之不执行
php a.php && php b.php
// 如果第一个命令执行不成功 $?!=0 则执行第2个命令 反之不执行
php a.php || php b.php
// 与;不同 |后的命令能读取上一个命令的stdout 而且|后的命令必须是能接收stdin的命令才行
ls /etc | less
// |后面一般可以跟过滤命令
// echo $PATH输出/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games:
// -d后面接分隔符 -f后面跟第几段(可用,隔开,隔开后会保留中间一个分隔符) -c从第几个字符起截取
echo $PATH | cut -d ':' -f 3,5 sbin // /sbin:/usr/local/bin
echo $PATH | cut -c 6- // /usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games:
// grep -a将binary档案以text档案的方式搜索 -c计算找到搜索字符串的次数 -i忽略大小写 -n顺便输出行号 -v反向选择(没有找到搜索字符串的行)
last | grep 'root' // 找出root登录的行
last | cut -d ' ' -f 1 | sort | uniq -c //当月登录用户按首字母排序并统计登录次数
// 当然grep可以不跟在|后面使用
grep 'echo' index.php
// wc 统计文件 -l行数 -w单词说(按空格统计) -m字符数 默认-lwm
wc index.php
last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l
// tee双向重导向(既重定向到文本又输出到屏幕) -a追加(append)
php test.php | tee -a test.log
// split将文件分割成多个 -b按大小分割单位b k m -l按行数分割
split -b 300k ./test.php test
// 可以将split分割的文件合并成一个
cat test* >> haha.php
// xargs生成指令参数 -0如何stdin含有特殊字符,\空格等 可以将它们还原成一般字符 -e EOF 后面跟一个字符串 当xargs分析到这个字符串就停止工作
// -p 执行每个指令的argument时,都会询问使用者的意思 -n后面接次数 每次command执行时要使用几个参数的意思