shell学习笔记

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习Shell命令时,以下是一些重要的注意事项和学习建议: 1. 基本语法:Shell命令通常由命令名称和参数组成。命令名称是要执行的操作,而参数则提供了命令所需的信息。了解Shell命令的基本语法是学习的第一步。 2. 命令帮助:大多数Shell都提供了内置的命令帮助功能。通过使用命令后跟`--help`或`-h`选项,或者使用`man`命令(例如`man ls`)来获取有关特定命令的详细信息。 3. 常用命令:有一些常见的Shell命令对于日常使用非常有用。这些包括`cd`(更改目录)、`ls`(列出目录内容)、`mkdir`(创建目录)、`rm`(删除文件或目录)等。逐步学习和掌握这些命令是很重要的。 4. 管道和重定向:Shell命令非常强大,可以通过管道和重定向符号将多个命令组合在一起。了解如何使用管道(`|`)将一个命令的输出作为另一个命令的输入,并使用重定向符号(`>`、`>>`、`<`)来控制输入和输出。 5. 脚本编写:Shell脚本是一种将多个命令组合在一起以自动化任务的方法。学习如何编写简单的Shell脚本可以提高工作效率。 6. 实践和练习:最重要的是进行实践和练习。尝试使用不同的Shell命令来完成各种任务,并在实际场景中应用所学知识。 记住,Shell命令的学习是一个逐步的过程。开始时可能会有些困惑,但随着实践和经验的积累,你会变得越来越熟练。希望这些提示对你有帮助!如有任何具体问题,随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值