shell的执行方法
注意在执行刚刚用touch创建的脚本的时候,需要使用chmod -x hello.sh来赋予可执行权限
1、./hello.sh
2、/bin/bash hello.sh
3、bash hello.sh
4、sh hello.sh
如果说在使用第4种方法运行脚本,可能出现/bin/bash不存在的现象,可以使用/usr/local/bin/bash的绝对路径避免
shell参数的合理使用
1、一般来说都会使用$来对参数进行传递
var="world"
printf "hello %s\n" "$var"
2、如果想要对传入参数进行使用
printf "hello %s\n" "$1"
配套使用
./hello.sh world这样就作为第一个参数传递进来
$1就相当于传入的第一个参数,$0的意思是shell脚本本身自己的名字
3、如果想要对shell运行后读取写入缓冲区的数据,也就是在运行shell的时候使用read方法
echo "Who are you?"
read name
echo "Hello, $name."
4、shell的强引用和弱引用之间的区别
弱应用是对变量进行使用
#!/usr/bin/env bash
world="World"
echo "Hello $world"
#> Hello World
强引用是不再使用$所能代表的变量
#!/usr/bin/env bash
world="World"
echo 'Hello $world'
#> Hello $world
#或者可以使用转义字符的方法不调用之前所代指的变量
#!/usr/bin/env bash
world="World"
echo "Hello \$world"
#> Hello $world
处理命名参数的问题
#!/bin/bash
deploy=false
uglify=false
while (( $# > 1 )); do case $1 in
--deploy) deploy="$2";;
--uglify) uglify="$2";;
*) break;
esac; shift 2
done
$deploy && echo "will deploy... deploy = $deploy"
$uglify && echo "will uglify... uglify = $uglify"
# how to run
# chmod +x script.sh
# ./script.sh --deploy true --uglify false
shell中关于括号使用的问题
主要的作用还是在变量的引用上,():初始化数组
a
r
r
a
y
=
(
a
b
c
)定义数组变量,开辟子
s
h
e
l
l
顺序执行,搭配
主要的作用还是在变量的引用上, ():初始化数组 array=(a b c)定义数组变量,开辟子shell顺序执行,搭配
主要的作用还是在变量的引用上,():初始化数组array=(abc)定义数组变量,开辟子shell顺序执行,搭配符号,用于命令替换,执行并获取命令输出赋值给变量
(()):作为整数的扩展,括号里面可以跟算数表达式,例如a = 5,((a++))用于计算复杂的算数表达式
[]:可以用于判断
或者支持下标访问,用于访问数组中的索引位置
#-z 判断文件是否存在
[-z xxx.txt] && echo 0 || echo 1
#-d 判断目录是否存在
[-d /home/usr] && echo 0 || echo 1
#-x 判断文件的是否含有执行权限
[-x xxx.txt] && echo 0 || echo 1
#总体上来说,[]是为判断而服务的
#下表索引的用法
$ ls
123 223 323 tests.c
$ ls [13]*
123 323
$ ls [1-3]*
123 223 323
[[]]:用于符号的判断,例如== != <=等等
#判断两个数字是否相等
[root@XiaoPeng scripts]# [[ 1 = 2 ]] && echo 0 || echo 1
#判断两个数字是否不相等
[root@XiaoPeng scripts]# [[ 1 != 2 ]] && echo 0 || echo 1
${ } 作为单词边界
[root@localhost ~]# echo "x = ${x}xy"
x = 1024xy
${#} 获取变量字符串长度
利用shell写for循环语句和if语句
files=( * )
# iterate over them
for file in "${files[@]}"; do
echo "$file"
done
#主要实现的功能是如果检测到某个pid还处于活跃的状态,那么对该进程进行后台执行
#!/bin/bash
#先判断文件是否存在,而不是直接看文件返回的fd进行判断,两种判断方式
if [[ ! -e /tmp/test.py.pid ]]; then # Check if the file already exists
python test.py & #+and if so do not run another process.
echo $! > /tmp/test.py.pid
else
echo -n "ERROR: The process is already running with pid "
cat /tmp/test.py.pid
echo
fi
cat
写 > 确认需要写的问价名字,再通过 << EOF来确认以什么样的标志位作为结束
cat > ~/.pip/pip.conf << EOF
[global]
timeout=6000
index-url = http://www.baidu.com
[install]
use-mirrors=true
mirrors = http://www.baidu.com
trusted-host = www.baidu.com
EOF
cat --number file,可以在显示文件内容的时候显示行号
grep
在文件中搜索模式串
在文件栏中找到foo字符串
grep foo ~/Desktop/bar
在文件中找到所有不包含foo字符串的行
grep –v foo ~/Desktop/bar
利用通配符找到文件中最后含有foo单词的字符串
grep "*foo" ~/Desktop/bar
shell重定向的一些问题
command > file 将输出重定向到 file
command < file 将输入重定向到 file
command >> file 将输出以追加的方式重定向到 file
n> file 将文件描述符为 n 的文件重定向到 file
n>> file 将文件描述符为 n 的文件以追加的方式重定向到 file
n>&m 将输出文件 m 和 n 合并,如2>&1,输出和错误重定向到同一个文件
n<&m 将输入文件 m 和 n 合并
给变量起别名
先定义变量,用关键字alias修饰,之后每次使用该变量不用$也可以直接调用后面的赋值内容
alias myAlias='some command --with --options'
myAlias foo bar baz
#结果
some command --with --options foo bar baz
同时也可以在一个文件中删除之前定义的alias
# create an alias
$ alias now='date'
# preview the alias
$ now
Thu Jul 21 17:11:25 CEST 2016
# remove the alias
$ unalias now
# test if removed
$ now
-bash: now: command not found
前后台作业
后台作业的两种方法:第一种为在脚本后面追加&符号,第二种为在脚本前面使用nohup命令,结尾再追加&符号
末尾的 & 符号相当于在后台进行运行
$ sleep 10 &
检查特定端口
检查特定的端口占用情况,也可以使用netstat进行查看
lsof -i :8080
输入输出重定向
">"是代表向文件中输入,重定向到输入fd上,并覆盖文件中的内容
">>"也是输入重定向,但是是将输入的内容添加在原有的文件后面
# Overwrite existing file
$ echo "first line" > /tmp/lines
# Append a second line
$ echo "second line" >> /tmp/lines
$ cat /tmp/lines
first line
second line
需要将一个程序中的一些内容传递到另一个程序上
可能会使用匿名管道
ls -l | grep ".log"
或者将开启一个临时文件,并通过这个临时文件进行访问
touch tempFile.txt
ls -l > tempFile.txt
grep ".log" < tempFile.txt
也可以通过设立命名管道,进行进程与进程之间的通信,其中mkfifo就是开启一个命名管道,将ls -l 的内容重定向到管道中,再利用管道的方法重定向到输出上
mkfifo myPipe
#在执行这个语句之后,cmd显示等待
ls -l > myPipe
#需要重新开启一个cmd,输入以下shell,可以调出之前ls -l的内容s
grep ".log" < myPipe
同理也可以对cat文件的内容进行一个展示
$ ls -l >mypipe &
$ cat file3 >mypipe &
GoalKicker.com – Bash Notes for Professionals 30
$ cat <mypipe
重定向到network地址
这么做的目的是将www.google.com/的默认页面重定向到标准输出上,也就是终端上
exec 3</dev/tcp/www.google.com/80
printf 'GET / HTTP/1.0\r\n\r\n' >&3
cat <&3
持续更新ing