Linux Shell学习(一)

Linux Shell

使用 echo $SHELL 来查看当前使用的shelllinux

在linux/unix系统中建立一个进程的方式是首先调用fork()系统调用子进程,而后在子进程中调用系统调用execve()执行一个可执行程序shell

用户在登录系统中之后只和shell程序进行交互,经过shell程序发送命令来告知系统作什么事情bash

可使用zsh的内建命令type来测试一个命令是内建命令仍是外部命令type -a cdapp

使用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

  • /dev/null是位桶,传送到此的文件会被系统丢掉
  • /dev/tty当程序打开此文件时,UNIX会自动重定向到一个终端
访问shell脚本的参数

查找一个用户是否登录

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

在命令行不带参数的执行catwc命令时,他们都会继续等待输入来执行相应的操做直到用户按下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标准输出替换掉了命令自己
相关文章
相关标签/搜索