简单输出一句话
shell脚本
#!/bin/bash
echo "我是你爹"
执行:./demo1.sh
python脚本
#!/usr/bin/python
#coding:utf-8
print("我是你爹")
执行:.python pydemo.py
sh命令执行 shell脚本后创建一个bash的进程 所以,可以看到再次输出name的时候是输出的
子shell中的变量
[root@VM-4-3-centos shelldemo]# vim mk_var.sh
[root@VM-4-3-centos shelldemo]# cat mk_var.sh
name="大西瓜"
[root@VM-4-3-centos shelldemo]# ll
total 12
-rwxr-xr-x 1 root root 32 Apr 8 17:40 demo1.sh
-rw-r--r-- 1 root root 17 Apr 8 19:14 mk_var.sh
-rwxr-xr-x 1 root root 54 Apr 8 17:51 pydemo.py
[root@VM-4-3-centos shelldemo]# bash mk_var.sh
[root@VM-4-3-centos shelldemo]# name="大菠萝"
[root@VM-4-3-centos shelldemo]# echo $name
大菠萝
[root@VM-4-3-centos shelldemo]#
[root@VM-4-3-centos shelldemo]# vim mk_var1.sh
[root@VM-4-3-centos shelldemo]# echo $userr
[root@VM-4-3-centos shelldemo]# sh mk_var1.sh
[root@VM-4-3-centos shelldemo]# echo $userr
[root@VM-4-3-centos shelldemo]# source mk_var1.sh
[root@VM-4-3-centos shelldemo]# echo $userr
root
[root@VM-4-3-centos shelldemo]# cat mk_var1.sh
userr=`whoami`
建议都用双引号 双引号能识别特殊字符,单引号只会原样输出单引号中的内容
[root@VM-4-3-centos bin]# name=libai
[root@VM-4-3-centos bin]# echo '${name}'
${name}
[root@VM-4-3-centos bin]# echo "${name}"
libai
这玩意用户登录时就会执行,并且执行后的变量只在当前用户下可见
[root@VM-4-3-centos ~]# echo $name
我是你爹111
[root@VM-4-3-centos ~]# cat ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
name="我是你爹111"
export PATH
[root@VM-4-3-centos ~]# useradd robert
[root@VM-4-3-centos ~]# sudo - robert
sudo: -: command not found
[root@VM-4-3-centos ~]# su - robert
[robert@VM-4-3-centos ~]$ echo $name
需要给用户设置该用户范围内可见变量 修改 bash_profile
需要设置全局变量 也就是所有用户可见 修改 etc下的profile
可以看到很多我们熟悉的,比如之前设置的JAVA_HOME
还有 HISTSIZE HOSTNAME等本身自带的
[root@VM-4-3-centos ~]# env |awk -F '=' '{print $1}'
HOSTNAME
SSL_CERT_FILE
TERM
SHELL
HISTSIZE
USER
LS_COLORS
USERNAME
PATH
MAIL
PWD
JAVA_HOME
TST_HACK_BASH_SESSION_ID
LANG
SSL_CERT_DIR
SHLVL
HOME
LOGNAME
CLASSPATH
LESSOPEN
PROMPT_COMMAND
HISTTIMEFORMAT
bash支持一次性执行多条命令 跟mysql一样 以分号分开即可
man bash 然后
/Special Para
记得 []中内容两侧要空格不然会报错 ./special_statusvar.sh: line 2: [0: command not found
[root@VM-4-3-centos shelldemo]# cat special_statusvar.sh
#!/bin/bash
[$# -ne 2]&&{
echo "must be two params"
exit 119
}
echo "执行成功"
[root@VM-4-3-centos shelldemo]# vim special_statusvar.sh
[root@VM-4-3-centos shelldemo]# ./special_statusvar.sh
must be two params
[root@VM-4-3-centos shelldemo]# ./special_statusvar.sh aa bb
执行成功
[root@VM-4-3-centos shelldemo]#
就像java中有各种字符串的方法比如 截取 替换等等
如下,批量把文件名中的 juege替换为juejue
[root@VM-4-3-centos shelldemo]# touch juege_{1..5}.jpg
[root@VM-4-3-centos shelldemo]# ls
demo1.sh juege_1.jpg juege_2.jpg juege_3.jpg juege_4.jpg juege_5.jpg mk_var1.sh pydemo.py special_statusvar.sh
[root@VM-4-3-centos shelldemo]# ls *.jpg
juege_1.jpg juege_2.jpg juege_3.jpg juege_4.jpg juege_5.jpg
[root@VM-4-3-centos shelldemo]# for file_name in `ls *.jpg`;do mv $file_name `echo ${file_name/ju*ge/juejue}`;
> done
[root@VM-4-3-centos shelldemo]# ll
total 16
-rwxr-xr-x 1 root root 32 Apr 8 17:40 demo1.sh
-rw-r--r-- 1 root root 0 Apr 9 22:48 juejue_1.jpg
-rw-r--r-- 1 root root 0 Apr 9 22:48 juejue_2.jpg
-rw-r--r-- 1 root root 0 Apr 9 22:48 juejue_3.jpg
-rw-r--r-- 1 root root 0 Apr 9 22:48 juejue_4.jpg
-rw-r--r-- 1 root root 0 Apr 9 22:48 juejue_5.jpg
-rw-r--r-- 1 root root 15 Apr 8 19:26 mk_var1.sh
-rwxr-xr-x 1 root root 54 Apr 8 17:51 pydemo.py
-rwxr-xr-x 1 root root 87 Apr 9 12:23 special_statusvar.sh
find dir_path -name pattern :查找文件夹中符合pattern的文件
这里用:=判断查找的文件夹名是否有效 比如如果不存在就替换为dir_path
[root@VM-4-3-centos shelldemo]# ll
total 16
-rwxr-xr-x 1 root root 32 Apr 8 17:40 demo1.sh
-rw-r--r-- 1 root root 0 Apr 9 22:48 juejue_1.jpg
-rw-r--r-- 1 root root 0 Apr 9 22:48 juejue_2.jpg
-rw-r--r-- 1 root root 0 Apr 9 22:48 juejue_3.jpg
-rw-r--r-- 1 root root 0 Apr 9 22:48 juejue_4.jpg
-rw-r--r-- 1 root root 0 Apr 9 22:48 juejue_5.jpg
-rw-r--r-- 1 root root 15 Apr 8 19:26 mk_var1.sh
-rwxr-xr-x 1 root root 54 Apr 8 17:51 pydemo.py
-rwxr-xr-x 1 root root 87 Apr 9 12:23 special_statusvar.sh
[root@VM-4-3-centos shelldemo]# dir_path=/shelldemo
[root@VM-4-3-centos shelldemo]# find ${dir_pp:=$dirpath} -name "juege*"
[root@VM-4-3-centos shelldemo]# find ${dir_pp:=$dirpath} -name "juejue*"
./juejue_2.jpg
./juejue_5.jpg
./juejue_3.jpg
./juejue_1.jpg
./juejue_4.jpg
ps -ef --forest看到的就是以下效果
简单来说内置命令启动时加载到内存,运行速度更快,使用 type 即可查看是否是内置命令
使用compgen -b查看所有内置命令
[root@VM-4-3-centos shelldemo]# type cd
cd is a shell builtin
[root@VM-4-3-centos shelldemo]# type exit
exit is a shell builtin
[root@VM-4-3-centos shelldemo]# compgen -b
.
:
[
alias
bg
bind
break
builtin
caller
cd
command
compgen
complete
compopt
continue
declare
dirs
disown
echo
enable
eval
exec
exit
export
false
$() 与 `` 都是在当前shell执行命令
()是开启子shell执行命令
${vars} 与 $vars是取值
[root@VM-4-3-centos shelldemo]# . caculation.sh 12 + a
12
this is a script for math caculation pls enter number1 operator number2 as three parameters
脚本内容如下
1.该脚本编写注意事项 必须双括号才是进行数值运算
2.if 后的[] 中内容前后必须要有空格
3.$?的值为上一条命令执行的结果 如果不为1表示执行失败
[root@VM-4-3-centos shelldemo]# cat caculation.sh
#!/bin/bash
echo "$(($1$2$3))"
if [ $? != 1 ];
then
echo "this is a script for math caculation pls enter number1 operator number2 as three parameters"
fi
[root@VM-4-3-centos shelldemo]# . expr_demo.sh aa.jpg
符合要求
[root@VM-4-3-centos shelldemo]# . expr_demo.sh aa.png
请输入以jpg结尾的文件名
[root@VM-4-3-centos shelldemo]# cat expr_demo.sh
#!/bin/bash
if expr "$1" ":" ".*\.jpg" &> /dev/null
then echo "符合要求"
else echo "请输入以jpg结尾的文件名"
fi
[root@VM-4-3-centos shelldemo]#
用./ 执行需要先加权限 chmod +x for_expr_demo.sh
[root@VM-4-3-centos shelldemo]# ./for_expr_demo.sh hello you are welcome to china , I am your father
长度不大于5的参数是
you
are
to
,
I
am
your
[root@VM-4-3-centos shelldemo]# cat for_expr_demo.sh
#!/bin/bash
echo "长度不大于5的参数是";
for word in $*
do
if [ `expr length $word` -lt 5 ]
then
echo $word;
fi
done
[root@VM-4-3-centos shelldemo]#
tr命令:text replace, 下面报错原因是 tr前面也需要管道符
[root@VM-4-3-centos ~]# echo {1..200}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
[root@VM-4-3-centos ~]# echo {1..200} tr " " "+" |bc
(standard_in) 1: syntax error
[root@VM-4-3-centos ~]# echo {1..200}|tr " " "+" |bc
20100
seq 10 生成1到10十个数字 seq -s +10 生成十个数字的同时使用+号连接
我们再使用之前说过的双括号运算即可 记得双括号内命令左右要加`` 外面要加$
[root@VM-4-3-centos ~]# seq 10
1
2
3
4
5
6
7
8
9
10
[root@VM-4-3-centos ~]# seq -s + 10
1+2+3+4+5+6+7+8+9+10
[root@VM-4-3-centos ~]# echo $((`seq -s + 200`))
20100
记得接收参数的命令是xargs 我第一次写成了 args
[root@VM-4-3-centos shelldemo]# seq -s " + " 10 | xargs expr
55
强调:对变量进行条件判断必须加双引号
使用 test 或者 [ ] 或者[[]] 进行条件判断
[root@VM-4-3-centos shelldemo]# touch aaa.sh
[root@VM-4-3-centos shelldemo]# echo `test -e aaa.sh`
[root@VM-4-3-centos shelldemo]# test -e aaa.sh && echo "aaa.sh 已存在" || touch aaa.sh
aaa.sh 已存在
[root@VM-4-3-centos shelldemo]# [ -e "aaa" ] && echo "aaa 文件已存在" || touch aaa
aaa 文件已存在
[root@VM-4-3-centos shelldemo]# a=20
[root@VM-4-3-centos shelldemo]# [[ $a > 5 ]] && echo "a的值大于5" || echo "a的值小于等于5"
a的值小于等于5
[root@VM-4-3-centos shelldemo]# [[ $a > 5 ]] && echo "a的值小于等于5" || echo "a的值大于5"
a的值大于5
[root@VM-4-3-centos shelldemo]#
单中括号 [ ] 与 双中括号的异同
单中括号 [ ]
a. [ ] 两个符号左右都要有空格分隔
b. 内部操作符与操作变量之间要有空格:如 [“a” = “b” ]
c. 字符串比较中,> < 需要写成 \> \< 进行转义
d. [ ] 中字符串或者${}变量尽量使用"" 双引号扩住,以避免值未定义引用而出错
e. [ ] 中可以使用 –a –o 进行逻辑运算
f. [ ] 是bash 内置命令:[ is a shell builtin
双中括号
a. [[ ]] 两个符号左右都要有空格分隔
b. 内部操作符与操作变量之间要有空格:如 [[ “a’ = “b” ]]
c. 字符串比较中,可以直接使用 > < 无需转义
d. [[ ]] 中字符串或者${}变量尽量使用”" 双引号扩住,如未使用""会进行模式和元字符匹配
e. [[ ]] 内部可以使用 && || 进行逻辑运算
f. [[ ]] 是bash keyword:[[ is a shell keyword
比如查看
/etc/init.d/functions
/etc/init.d/mysql
脚本
&& ||跟java中一样
让用户选择输入数字,数字对应会执行命令 这里比较简单就不写了
注意事项 一个if 对应 一个 fi 然后 [] 或者[[]]中内容首尾都要加空格
NR:number of row 行数 起始行为1 NF:number of field 总列数
所以如下两条命令的效果一样,因为总列数为7 值不同是因为两次命令删除的间歇刚好消耗了1m
[root@VM-4-3-centos ~]# free -m | awk 'NR==2 {print $NF}'
2746
[root@VM-4-3-centos ~]# free -m | awk 'NR==2 {print $7}'
2745
[root@VM-4-3-centos ~]# free -m
total used free shared buff/cache available
Mem: 3694 659 132 0 2902 2746
Swap: 0 0 0
[root@VM-4-3-centos ~]# free -m | awk 'NR==2 {print $NF}'
2746
[root@VM-4-3-centos ~]# free -m | awk 'NR==2 {print $7}'
2745