Shell 简单学习




Shell:  命令解释器
Shell 把命令发送给Linux内核,Linux调用底层的系统硬件,然后把结果返回

Shell 常用操作功能
   Tab键自动补齐

	查看历史命令:
		     history
		     !n			执行历史记录中第n条命令
		     !str		执行历史记录中以“str”开头的命令

	命令别名:
		alias ddd='df -Th'      ddd是别名,df -Th是执行的命令
		unalias 别名		取消已经设置的命令别名
		可以把使用频率高的复杂命令设置简短的别名放在  ~/.bashrc

	输出重定向:
		  重定向标准输入:操作符 <   ,将命令中接收输入的途径由默认的键盘更改为指定的文件
		  重定向标准输出:操作符 >   ,将命令的执行结果输出到指定的文件中,而不是显示在屏幕
				  操作符 >>  ,将命令执行的结果追加输出到指定文件
		  重定向标准错误:操作符 2>  ,清空指定文件的内容,并将标准错误信息保存到改文件中
		   		  操作符 2>> ,将标准错误信息追加输出到指定的文件中
		  重定向标准输出和标准错误: 操作符 &> , 将标准输出、标准错误的内容全部保存到指定的文件中
			1>  正确的输出  2>正确的输出

		   ls  >> root.txt
		   ls / >> root.txt
		   ifconfig  > net.txt
		   ifconfig  1> net.txt        
		   13131  2> test.txt		把执行命令的错误结果存放到test.txt

	管道操作:  管道操作符: " | "
		把 " | " 前面的数据 给  " | " 后面的数据加工操作
		free -m 
		free -m |grep mem     查找(帅选)包含 mem的项
		free -m |grep -i mem		-i表示忽略大小写
		free -m |grep -i mem | awk '{print $4}'	  找到包含mem的项,用awk命令打印出第四列的数据
		free -m |grep -i mem | awk '{print $4,$2}'

----------------------------

查看文件属性

ls -l file
权限类型
rwx 读,写,执行

-(- 代表普通文件,d 目录文件)rw-rw-r-- 1 ubuntuserver(创造文件的所有者) ubuntuserver(所属组) 115 Mar 16 02:08 test.txt
    rw-rw-r--  三种人群(所有者(ubuntuserver用户),所属组(ubuntuserver组内的用户),其他用户(ubuntuserver以外的用户))的权限
  Linux 的用户: 所有者(u),所属组(g),其他用户(o) ,所有用户(a)

  查看用户 
	 id			查看用户
	 id 用户名		
   
   用户添加  useradd 用户名
   用户删除  userdel -r 用户名
   把用户加入组   gpasswd -a  用户名  组名
   把组中用户删除  gpasswd -d 用户名  组名

  权限:
   (1) chmod
    chmod 用户+权限 文件名字
    chmod o+w text.txt     增加文件的other用户的写权限
    chmod o-w text.txt     减少文件的other用户的写权限
     
    chmod (3个)数字(对应所有者,所属组,其他用户的权限) 文件名字
    权限对应的数字   r  4 ,  w 2   , x  1
    chmod 755 file           755  rwx r-x r-x
     
    (2) acl授权
      设置权限		setfacl -m u:用户名:权限(rwx)  test.txt       
      查看权限		getfacl test.txt
      删除user1在 test.txt上的权限		   setfacl -x u:user1 test.txt
      删除/test上的所有acl权限		setfacl -b test.txt
      设置acl的默认权限		setfacl -m d:u:user1:rwx test
      当前目录的子目录会继承目录的acl权限
      对目录以及子目录和文件设置 acl权限 setfacl -m u:user:rwx -R  /mnt/


      --------------------------------
      Shell脚本:  包含多条Linux命令的普通文本文件
      脚本文件中包含的内容:
      	运行环境设置:  #!/bin/bash
	注释信息:以#开始的说明性文字
	可以执行的Linux命令行

	执行脚本的方式  bash ./test1.sh			 sh ./test1.sh
			或者 先添加权限 chmod a+x test1.sh   ,然后  ./test1.sh
      
      		简单shell脚本例子1
		 #!/bin/bash
   		 echo '输出...'
		 echo     #空一行
   		 df -Th
		cho
		#时间输出到指定文件,文件可以不存在
		date  >>  Log.log
		 
		--------------------------
	Shell变量的种类
	用户自定义变量: 由用户自己定义
	预定义变量: Bash预定义的特殊变量,不能直接修改
	位置变量: 通过命令行给程序传递执行参数
	
	定义新的变量:  变量名=变量值
	查看变量的值:   echo   $变量名
	通过$ 符号引用指定名称的变量值

	name="user1"
	echo "my name is $name"      结果: my name is user1
	echo "my name is ${name}fg"   结果: echo "my name is user1fg" 

	从键盘输入内容为变量赋值:  read  -p  "信息"  变量名
	read -p "请输入名字:"  name

	不同引用操作变量
	双引号""  : 允许通过$符号引用变量值,
		 echo "my name is $name"    如果用单引号无法解析name的值
	单引号'' :禁止引用变量,$视为普通符号,不能解析转义字符
	反撇号`` : 将命令执行的结果输出变量
		str=`echo 123`
		echo $str

	清除用户定义的变量:   unset 变量名


	位置变量: 
		表示为$n,n为1~9之间的数字  
	
	#test.sh
	echo $1
	echo $2
	echo $3
	echo $4
	执行的时候,把外部的参数传递给脚本    ./test.sh a b c d
	脚本内的$1,$2,$3, $,4 会接收到参数
	
	case $1 in
		start)
		echo 'start...'
		;;
		stop)
		 echo 'stop...'
		 ;;
	 esac

	 两个数之和的运算 echo $(($1+$2)) 或者 expr 10 + 20  加号左右要有空格


	 预定义变量:
	 	$#    命令行中位置参数的个数
		$*    所有位置参数的内容
		$?    上一条命令执行后返回的状态,当返回状态为0表示执行正常,非0值表示执行异常或者出错
		$0    当前执行的进程/程序名

	for i in $* ; do
		echo $i
		sleep 1
	done

	tot=0
	for i in $* ; do
		tot=$(($tot+$i))	 
	done
	echo $tot

	ls -l
	echo $?
	if [[ $?==0 ]]; then
		echo '上条命令执行成功'
	else
		echo '上条命令执行失败'
	fi

	计算整数表达式的运算结果 expr 变量1 运算符 变量2  ...[运算符  变量n]
	运算符:  
	加法 +  
	减法 -
	乘法 \*
	除法 /
	求模(取余)运算  %

	num=`expr 2 + 3 + 4`
	num=`expr 2 /* 4`      # *要转义
	num=$((2*4))        # 这种形式不用转义*
	echo $num


	----------------------------
	echo -e  "myname \n abc"     # -e 可以解析转义字符
	echo -n  "Input your name"    # -n  输出的内容不换行
	read name		# 从键盘输入的值 赋值给变量name
	echo $name

	echo       #echo单独一行,可以输出空行

	echo -e "\033[32;40m  [test]  \033[0m"	#输出 [test]  带有背景颜色和字体颜色
	echo -e "process \033[32;40m  succuess  \033[0m"
	echo -e "process\033[32;40msuccuess\033[0m"

	\033[前景颜色;背景颜色m
	\033[0m        0 代表恢复到系统默认的颜色,如果没有\033[0m这个结尾,系统的字体颜色会被改变
	字体颜色:
		30 黑色前景
		31 红色前景
		32 绿色前景
		33 棕色前景
		34 蓝色前景
		35 紫色前景
		36 青色前景
		37 白色前景
	  背景颜色:
	  	40 黑色前景
		41 红色前景
		42 绿色前景
		43 棕色前景
		44 蓝色前景
		45 紫色前景
		46 青色前景
		47 白色前景

		cat<<x        # x可以是任意字符,从x开始输出直到遇到x标记
		  abdaaaaaaa
		 x

		 把执行的结果保存到文件
		 ./test.sh | tee   menu.txt
		
		查看文件带行号
		 cat Log.log|nl

	----------------------------------

	测试命令: 测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数值
		格式:  测试命令 条件表达式  [ 测试命令 条件表达式 ]
		常见测试类型
		    测试文件状态
		    字符串比较
		    整数值比较
		    逻辑测试

		  测试文件状态   [ 操作符   文件或者目录 ]     注意中括号左右两边有空格
		      常用的测试操作符
		      	-d  测试是否为目录(Directory)
			-e  测试目录或文件是否存在(Exist)
			-f  测试是否为文件(File)
			-r  测试当前用户是否有权限读取(read)
			-w  测试当前用户是否有权限写入(write)
			-x  测试当前用户是否有权限执行(execute)
			-L  测试是否为符号连接文件(Link)
			
			例子:
			[ -d a.test  ]
			echo $?		# $? 得到返回的状态,非0是异常的

			if [ -e ./file1 ]
			then
			   echo "file is exist!"
			 else
			   echo "file is not exist!"
			   touch file1		# 创建文件
			 fi

			 整数值比较    [ 整数1 操作符 整数2 ]
			 常用测试操作符:
			     -eq 等于(Equal)
			     -ne 不等于(Not equal)
			     -gt 大于(Greater than)
			     -lt 小于(Less than)
			     -le 小于或等于(Lesser or Equal)
			     -ge 大于或等于(Greater or Equal)
			      
			      age=20
			      if [ $age -gt 18  ] 
			      then
			         echo "greater"
				 else
				   echo "lesser"
				 fi

		       
		       字符串比较:
		       	  [ 字符串1 = 字符串2 ]        注意 等号的前后有空格
			  [ 字符串1 != 字符串2 ]
			  [ -z 字符串 ]           字符串内容为空

			例子:
			  read -p 'name:' name
			  read -p 'pass:' pass
			  if [ $name = 'admin' ] && [ $pass = '123' ]
			  then
			      echo '成功'
			   else
			       echo '失败'
			    fi
			  

			逻辑测试
			    [ 表达式 ] 操作符 [ 表达式2 ]  ...
			  常用测试操作符
			  -a或&&  逻辑与,前后两个表达式都成立时,整个结果为真,否则为假
			  -o或|| 逻辑或, 操作符两边至少有一个真,结果为真
			  ! 逻辑否 :当指定的条件不成立时,返回结果为真

			  ls && echo 'yes'

	--------------------------------
	
	score=87 
	if [ $score -lt 60 ];then
	   echo '60分以下'
	 elif [ $score -ge 60 ] && [ $score -lt 70 ];then
	   echo '60-70之间'
	  elif [ $score -ge  70 ];then
		echo '大于70'
	  fi

	#week=1
	week= `date +%w`

	case $week in
	   1)
	   echo '一'
	   ;;
	   2)
	   echo '二'
	   ;;
	   3)
	   echo '三'
	   ;;
	   *)
	    echo '其他'
	   esac         

	   sex='男'

	   case $sex in
	   '男')
	   echo '性别为男'
	   ;;
	   '女')
	   echo '性别为女'
	   ;;
	   *)
	    echo '不存在'
	   esac    


	   num=10
	   while [ $num -gt 0 ]
	   do
	   	if [ $(($num%2)) -eq 0 ];then
		   echo $num
		 else
		   echo -e "\033[37;40m ${num}\033[0m"
		fi

		num=$(($num-1))
	   done

#for循环
	   for i in  user0 user1 user2
	   do 
	     echo $i
	   done
	    
	    #把文件每行输出
	   for i in `cat user.txt`
	   do 
	      echo $i
	    done

	#cat /etc/passwd|awk -F: '{print $1}'  返回文件第一个列
	for i in `cat /etc/passwd|awk -F: '{print $1}'`
	do 
	   echo $i>>user.txt
	done

	#------

	for((i=0;i<10;i++))
	do
	   echo $i
	   if [ $i -eq 5 ];then
		break
	   fi
	done

	for((i=0;i<10;i++))
	do
	
	   if [ $i -eq 5 ];then
		continue
	   fi
	      echo $i
	  done

	#----

	read -p 'please press one key: ' key

	case $key in
	   [a-z]|[A-Z])
	      echo '字母键!'
	      ;;
	    [0-9])
	       echo '数字键'
	       ;;
	      *)
	        echo '功能键'
		;;
          esac

	  -------
	  Shift 用于迁移位置变量,把输入的位置变量$1~$9一次从左迁移,
	  	执行一次shift,总的位置变量会少一个

	  tot=0
	  while [ $# -gt 0 ]
	  do
	      tot=$(($tot+$1))
	      shift
	   done
	   echo $tot

	   -------------
	函数
	 function 函数名() {
		命令序列
	 }

	function 函数名{
		命令序列
	}
	
	调用已定义的函数
	      函数名
	 向函数内传递参数
	    函数名  参数1  参数2  ...

	 例子

	    function add()
	    {
		num=$1
		tot=0
		 
		 for((i=1;i<$num;i++))
		 do
			tot=$(($tot+$i))
		 done
		# return $tot
		echo $tot
	    }

	    add 10   #调用
	    add 200
	#-----------
	    function add2()
	    {
	      echo $(($1+$2))
	    }
		
		 add 10 20


-----------------------------
    awk
       
       # $0 代表整行
       awk '{print $0}'  access.log   #查找文件的每一行

	# -F 分割的意思 -F: 以冒号作为分割符 ,默认分割符是空格
	#  返回第一列,第二列,第三列
       cat /etc/passwd | awk -F: '{print $1,$2,$3}'
	cat /etc/passwd | awk -F: '{print $1" => "$2 "=>" $3}'

	#打印df命令结果的第三行  NR(number row) 行数
	df|awk '{if(NR==3){print}}'
	df|awk '{if(NR==3){print $1}}'
	#字符串结果转整型
	df|awk '{if(NR==3){print int($3)}}'

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值