使用 echo $SHELL
来查看当前使用的shelllinux
在linux/unix系统中建立一个进程的方式是首先调用fork()系统调用子进程,而后在子进程中调用系统调用execve()执行一个可执行程序shell
用户在登录系统中之后只和shell程序进行交互,经过shell程序发送命令来告知系统作什么事情bash
可使用zsh的内建命令type来测试一个命令是内建命令仍是外部命令type -a cd
app
使用zsh的内建logout
命令或者内建的exit
命令退出less
使用alias为某一个命令指定别名alias la='ls -al'
测试
所谓的shell脚本就是一个文本文件,只要在文本文件中输入咱们想要执行的命令便可(一个命令占用一行),若是想要命令在一行内使用须要在每一个命令中使用";"来分隔,使用source SHELL文件
来执行shell脚本this
使用chmod +x 文件
为shell脚本加上可执行权限命令行
使用#!/bin/bash
告诉系统使用指定的shell程序来执行这个脚本文件(必定要写在脚本文件第一行的开头处,不然会被当成注释处理)unix
分号(;)可用来分隔同一行的多条命令,shell会一次执行这些命令,若是使用的是&
而不是分号,意味着shell不用等到该命令完成就能够继续执行下一个命令code
变量:shell变量名称的开头是一个字母或下划线,赋值方式为变量名称=字符
,当你想取出shell变量的值时,须要在变量名称前面加上$
字符,当所赋予的值内含空格时,请加上引号
<
改变标准输入,program < file 可将program 的标准输入修改成file>
改变标准输出,program > file可将program的标准输出修改成file(当文件不存在的时候,会新建一个,存在的话,它就会被覆盖掉)>>
附加到文件,program >> file可将program的标准输出附加到file的结尾处(若是目的文件不存在>>重定向符便会新建一个,存在的话TA会将产生的数据附加到文件结尾处)#####特殊文件:/dev/null与/dev/tty
查找一个用户是否登录
cat > finduser #!/bin/sh #test //shell会忽略开头以'#'的行,除了首行 who | grep $1 ^D
使用shell显示每一个被执行到的命令
能够在脚本中使用set -x
命令来执行追踪的功能打开,而后再用set +x
命令关闭它
cat > trace1.sh #!/bin/sh set -x //打开追踪功能 echo 1st echo set+x //关闭追踪功能 echo 2nd echo ^D
在屏幕上输出一个字符串
#!/bin/bash data="fuck" echo "u name is :" echo $data
须要注意的是shell默认赋值是字符串赋值
#!/bin/bash _value=1 _data=$_value+2 echo $_data //此时输出的结果不是3,而是1+2 使用`$[]`讲括号内的表达式做为数学运算先计算结果后再输出 #!/bin/bash _value=1 _data=$[$_value+2] echo $_data 此时输出的结果是3
查看系统中被多少个用户登录了 $cat > nusers //创建文件,使用cat复制终端的输入 who|wc -l // 程序的内容 ^D // ctrl-D表示end-of-file chmod +x nusers //让文件具备可执行的条件 ./nusers // 执行测试
cat 经常使用的有-n
和-b
选项 -n的做用是给全部输出的行号前面添加标号
,-b的做用只给非空行添加符号
使用less
命令,则可使用方向键来反复地浏览文件内容
建立文件夹使用mkdir
,建立文件以其子文件使用mkdir -p
使用 rm -i
来删除文件 ,使用 rmdir
来删除空目录,使用rm -rf
来删除非空目录
1)使用mv -v
来修改文件和目录的名字,-cv
来显示mv具体作了什么事情 2)使用mv
进行文件和目录的移动
符号链接:能够在多个目录中保存同一个文件的拷贝,而不占用新的存储空间,其最大的优势是原始文件的内容被更新后,所指向原始文件的连接文件都会被更新
使用ln -s 来建立一个符号连接
,使用rm -rf 符号连接名称
来删除符号连接
ln -s display shit // -s为建立的符号链接 , display 但愿链接的目录 shit 是最后建立出来的连接文件 cd shit pwd -L //显示工做目录的逻辑值 pwd -P //现实工做目录的实际值
使用cp - v 源文件地址 目的文件夹
来复制文件,使用cp -r
来复制目录
使用chown root 文件
来修改文件和目录的全部者
普通用户执行passwd
来修改登录密码
有一种特殊的权限位叫作黏着位,它只对目录起做用,对一个目录来讲,除了他的全部者之外,其余用户也拥有写权限和执行权限,由于黏着位t只对目录起做用,而且只能出如今权限位的最后一位
重定向ls
命令输出到文件data.txt:ls > data.txt
完整的形式应该以下:command 1> outputfile
上面的形式省略了标准输出的文件描述符数字1,使用ls
发现格式由原来的纵向变成了横向,由于ls的开发者在源代码进行了判断,若是执行ls命令被标准输出重定向,则以行的格式输出数据
能够把一系列的命令的输出同时重定向到一个文件内,例如{date;df -h,uptime;} > list.txt
以追加的形式像文件中追加数据
#!bin/bash echo echo "wtf" echo "(`date`)">>append.txt //记录脚本被运行时间 //追加标准输出到文件append.txt中 echo "the file list of $PWD is :">>append.txt ls -C>>append.txt //以列输出格式来记录文件中的文件列表 echo >> append.txt exit 0
当把文件标准输出重定向到文件,还有另一种方法不会直接覆盖掉已经存在的文件,就是使用bash自带的noclobber
set -o noclobber
打开选项noclobber若是文件已经存在的话,bash会输出错误信息
#!/bin/bash echo #关闭选项noclobber set +o noclobber if [ $? -eq 0 ] then echo "Set +o turn off the protection" fi echo #$?最后运行的命令的结束代码(返回值) #-eq: 适用于或偏向于 "数字相等" echo "create file when set +o noclobber">noclobber.txt if [ $? -eq 0 ] then echo "Set +o turn off the protection" fi echo "create file when set +o noclobber">noclobber.txt set -o noclobber if [ $? -eq 0 ] then echo "Set -o turn on the protection" fi #再次覆盖掉这个文件,会显示错误 echo "report">noclobber.txt
当一个命令读取输入数据时,是从它的标准输入流读取的,表明标准输入流的文件描述符是0,流的名字是stdin
在命令行不带参数的执行cat
和wc
命令时,他们都会继续等待输入来执行相应的操做直到用户按下ctrl+d
结束
#!/bin/bash linenumber=1 #首先利用bash的内建命令来读取/etc/passwd文件的第一行 #所以read读完一行以后就会中止并把读取到的值赋值给oneline read oneline while ["$oneline"!=""] do echo -e "$linenumber:$oneline\n"; linenumber=`expr $linenumber + 1` #使用外部命令expr对行号linenumber执行加1的算数操做 read oneline done source input.sh < /etc/passwd
标准输出的文件描述符是1,标准错误输出文件的描述符是2
#!/bin/bash echo "this is a test just make me happy" #可以找到的文件输入到标准输出到文件中,而系统找不到的文件会把相应的错误信息输入到文件中 ls /bin/bash /bin/ls adasd/asd >testSuccess.txt 2>successError.txt
经过shell将标准错误输出和标准输出输出到相同的地方
#!/bin/bash echo "create two files in current dire" ls bin/bash /bin/ls fuck/aaa &>same.txt ls bin/bash /bin/ls fuck/aaa >same.txt 2>&1 ls bin/bash /bin/ls fuck/aaa >same.txt 2>same.txt 1>&2
上述的三种格式均可以实现这个功能
若是咱们要把一个程序的输出数据做为另外一个程序的输入数据,应该使用管道
#!/bin/bash linenumber=1 #while循环语句增长了管道做为输入流 #$1就是指命令行的上一个参数 cat $1|while read oneline do echo -e "$linenumber:$oneline\n" linenumber=`expr $linenumber + 1` done exit 0
把某个文件输出的同时,并把输出的结果保存在文件中
#!/bin/bash #排序命令能够经过sort来实现 #这里的cat经过-n在每一行前面加了行号 #命令tee复制它的标准输入到标准输出及一个指定的文件 sort /etc/passwd|cat -n|tee sort.out
实际上rm 命令不接受任何标准输入,只接受命令行参数
#!/bin/bash #rm -i $(find . -name '*.out') rm -i `find . -name '*.out'` $(command)或者`command` 这两种都是用命令command标准输出替换掉了命令自己