01_shell 学习

shell

shell是核心程序kernel之外的指令解析器,是一个程序,同时是一种命令语言和程序设计语言。
   shell是命令解析器,用户输入命令,它去解析。
   shell类型 ash、bash、ksh、csh、tcsh
   shell类型 ash、bash、ksh、csh、tcsh
   cat /etc/shells 看系统下的shell  
   echo $SHELL 看当前用户运行的shell

hzmct@U-64:/study/linuxtest/day03$ cat /etc/shells 
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/bin/ksh93
/bin/rksh93
//bash特点,快速(上下键);tab键盘自动补齐;自动帮助功能help
hzmct@U-64:/study/linuxtest/day03$ help
//显示linux下默认的shell     
hzmct@U-64:/study/linuxtest/day03$ echo $SHELL
/bin/bash
//shell中运行子shell
hzmct@U-64:/study/linuxtest/day03$ /bin/dash
$
//退出子shell
hzmct@U-64:/study/linuxtest/day03$ /bin/dash
$ exit
hzmct@U-64:/study/linuxtest/day03$
   程序在shell中运行
   ls命令执行过程分析
shell程序读取用户的输入,解析用户的输入字符,然后搜索PATH这个全局变量保存的路径,寻找ls命令,若找到,则fork()一个子进程,调用exec()加载ls命令

存取权限与安全

-d目录
–一般文件 
–l快捷方式 
–c字符设备 
–b块设备 
-s-socket设备文件 
–p管道文件

chown

1、更改用户名和用户组名
chown 用户名.用户组名 文件名
chown .用户组名 文件名
chown 用户名.用户组名 -R 文件夹名

chown .hzmct 4.txt//注意有个点
//改变用户组名
chgrp root 4.txt
chgrp -R root 文件夹

chmod

chmod [who] operator [permission] filename
who(u用户 , g用户组, o其他, a所有用户)
operator(+增加权限, -取消权限, = 赋予给定权限并取消其他权限)
permission(r可读, w可写, x可执行, s具有超级用户, t执行文件在缓存)
chmod有两种用法 (The format of a symbolic mode)
1、  数字方式
用户 用户组其他 增加=   读 写 执行 s(具有超级用户)t(执行文件在缓存)
eg:    
        chmod改变文件或者目录的权限位
        man chmod 
        r w x 数字代表 4 2 1
        chmod u=rwx,g-x,o+xs 1.txt
注意:S位存在的意义:写一个程序,被执行是,临时拥有超级用户权限,执行完毕以后,有恢复普通身份,例如,写一个数据库脚本,这个数据库脚本具有超级管理员身份运行,运行完毕以后,恢复普通身份,避免破坏系统。
查看带有s位的应用程序,命令  ls -l /bin | grep ‘^…s

umask

umask命令,用来指定,用户创建文件、目录,默认的权限位

umask的默认配置 $HOME/.profile (ubuntu16.04)

hzmct@U-64:/study/linuxtest/day03$ umask
0002
hzmct@U-64:/study/linuxtest/day03$ touch 2.txt
hzmct@U-64:/study/linuxtest/day03$ ll
421
-rw-rw-r-- 1 hzmct hzmct    0 828 18:24 2.txt
文件默认权限664
drwxrwxr-x 2 hzmct hzmct 4096 828 18:25 2/
目录默认权限 775

规律:如果 文件权限位=7-umask-1  目录权限位=7-umask
ls –lda 命令只查看目录
ls -lh      -h易于人阅读

硬连接和软连接

ln source path  targh path    //硬连接
ln -s source path  targh path //软连接

-rwxrwxrwx 2 hzmct hzmct  281 825 16:36 1.sh*
-rwxrwxrwx 2 hzmct hzmct  281 825 16:36 硬链接.sh*
lrwxrwxrwx 1 hzmct hzmct    4 825 16:38 软连接.sh -> 1.sh*
(开头是l表示是快捷方式)

这里写图片描述

.bashrc

source ./bashrc
. ./bashrc     . 表示执行

alias

hzmct@U-64:~$ help alias
alias: alias [-p] [name[=value] ... ]
    Define or display aliases.

    Without arguments, `alias' prints the list of aliases in the reusable
    form `alias NAME=VALUE' on standard output.

    Otherwise, an alias is defined for each NAME whose VALUE is given.
    A trailing space in VALUE causes the next word to be checked for
    alias substitution when the alias is expanded.

    Options:
      -p    Print all defined aliases in a reusable format

    Exit Status:
    alias returns true unless a NAME is supplied for which no alias has been
    defined.
hzmct@U-64:~$ alias -p 
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

hzmct@U-64:~$ alias chen="pwd"
hzmct@U-64:~$ chen
/home/hzmct

wc

hzmct@U-64:/study/linuxtest/day03$ wc 1.txt
  3   15  152   1.txt
 行数 字数 字节数 文件名
hzmct@U-64:/study/linuxtest/day03$ cat 1.txt 
hzmct    tty7         2018-08-26 10:18 (:0)
hzmct    pts/1        2018-08-26 10:20 (192.168.66.1)
hzmct    pts/9        2018-08-26 11:25 (192.168.66.1)
hzmct@U-64:/study/linuxtest/day03$ wc -c 1.txt
152 1.txt
hzmct@U-64:/study/linuxtest/day03$ wc -l 1.txt
3 1.txt
hzmct@U-64:/study/linuxtest/day03$ wc -w 1.txt
15 1.txt

od

查看二进制文件信息
- t 指定数据的显示格式
    参数
    1. c --> ASCII字符
    2. d --> 有符号十进制数
    3. f --> 浮点数
    4. o --> 八进制数
    5. u --> 无符号十进制数
    6. x --> 十六进制数

du

查看目录的大小
hzmct@U-64:/study/linuxtest/day03$ du -h 
4.0K    ./mulu
4.0K    ./2
72K .

df查看磁盘的使用情况

hzmct@U-64:/study/linuxtest/day03$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            472M     0  472M   0% /dev
tmpfs            99M  6.4M   92M   7% /run
/dev/sda1        19G  8.3G  9.4G  47% /
tmpfs           492M  188K  492M   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           492M     0  492M   0% /sys/fs/cgroup
tmpfs            99M   36K   99M   1% /run/user/108
tmpfs            99M     0   99M   0% /run/user/1000

which

查看指定命令所在的路径
which指令会在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。
cd 这个常用的命令竟然找不到啊!为什么呢? cd 是bash 内建的命令!

tar

这里写图片描述

//压缩
tar zcvf 压缩包名字.tar.gz 原材料(要打包压缩的文件或目录)
tar zcvf day01.tar.gz day01 > /dev/null &

//解压
tar zxvf myfile.tar.gz -C 解压目录

查看里面的文件
tar tvf 1.tar.gz

sort

//排序
sort < mufile.txt

//将排序的结果重定向到文件中
sort < myfile.txt >myfile+sort.txt

//空格的转义字符
touch my\ file 

touch "wang bao ming"

shell本地变量

   本地变量在用户现有的shell生命周期中使用
   定义本地变量:MYVAR=”test” 注意=左右不要有空格
   退出终端,重新登录,问,刚才登录的本地变量还存在吗?
   仔细思考本地变量背后的含义! echo $MYV 每登录一个终端,都会运行一个shell程序,这个本地变量,就保存在这个shell程序中;如果再新登录,将启动新的shell程序,与原来的shell不同。建立起概念。

定义本地变量
var="helloworld"

使用本地变量
 echo $var  或者   echo ${var}

设置本地变量的只读属性
 readonly var="kkk"

查看刚才定义的本地变量 
set | grep var

显示本地所有的变量
set 

注意:本地变量只保存在当前的shell程序中
例子:
//局部变量只能在当前shell有效
hzmct@U-64:/study/linuxtest/day03$ var="hello world"
//启动另一个shell sh
hzmct@U-64:/study/linuxtest/day03$ sh
$ echo $var

$ exit
hzmct@U-64:/study/linuxtest/day03$ echo $var
hello world

环境变量

登录进程称为父进程
shell中执行的用户进程均称为子进程

环境变量用于所有的用户进程(称为子进程)
本地变量只用于现在的shell,环境变量用于所有的子进程,包括编辑器、脚本、应用程序

环境变量的设置
cat $HOME/.profile

环境变量对所有的用户进程都有效
声明环境变量 export var="helloworld"
查看环境变量 env

心里要有shell 心里要有Linux内核

shell中的反引号、单引号、双引号

双引号会引用变量的值
hzmct@U-64:/study/linuxtest/day03$ echo -e "chenlei $SHELL"
chenlei /bin/bash
单引号不做任何解释,直接输出
hzmct@U-64:/study/linuxtest/day03$ echo -e 'chenlei $SHELL'
chenlei $SHELL
反引号,里面的东西是执行命令
hzmct@U-64:/study/linuxtest/day03$ test=`date`
hzmct@U-64:/study/linuxtest/day03$ echo $test
2018年 08月 29日 星期三 15:34:09 CST

特殊字符

   双引号(“”):用来使shell无法认出空格、制表符和其他大多数特殊字符,比如:建立一个带空格的文件touch “wang bao ming”。
   单引号(‘):用来使shell无法认出所有特殊字符。
   反引号(`):用来替换命令
   反斜杠(\):用来使shell无法认出的特殊字符,使其后的字符失去了特殊的含义,转义字符。eg:创建带空格文件名 touch my\ file
   分号(;):允许在一行上放多个命令。mv 1.txt 2.txt;  mv 2.txt 3.txt;
   &:命令后台执行
   括号():创建成组的命令
   大括号{}:创建命令块。
   竖杠(|):管道标示符
   < > &:重定向表示符
   * ? [ ] !:表示模式匹配
   $:变量名的开头
   #:表示注释(第一行除外)
   空格、制表符、换行符:当做空白  

变量替换

   用变量的值替换它的名字
   echo
   在变量名前加$,使用echo命令可以显示单个变量取值。
   echo ${MYVAR} 或者echo $MYVAR 

定义本地变量
$ var4="1234"
若设置了变量,则显示变量的值,否则显示新值
$ echo ${var4:?"meiyou"}
1234
若设置了变量,则显示新值,否则显示为空
$ echo ${var4:+"meu"}
meu
若设置了变量,则显示变量的值,否则显示新值
$ echo ${var4:-"33"}
1234
若设置了变量,则显示变量的值,否则显示新值
$ echo ${var4:="44"}
1234
//清除变量 
   readonly的变量,不能被清除
$ unset var4
$ echo ${var4:?"meiyou"}
-bash: var4: meiyou
$ echo ${var4:+"meu"}

$ echo ${var4:-"33"}
33
$ echo ${var4:="44"}
44

位置变量

hzmct@U-64:/study/linuxtest/day03$ cat weizhibianliang.sh 
例1#!/bin/bash
echo "脚本的名字 $0"
echo "parm 1 $1 "
echo "parm 2 $2 "
echo "parm 3 $3 "
echo "parm 4 $4 "
echo "parm 5 $5 "
shift 2
echo "Here's the new first parameter: $1"

echo "显示参数的个数: $#"
echo "显示脚本的全部参数: $*"
echo "脚本运行的当前进程ID号: $$"
echo "显示前一命令运行后状态: $?"

执行脚本
hzmct@U-64:/study/linuxtest/day03$ ./weizhibianliang.sh 11 22 33 44 55
脚本的名字 ./weizhibianliang.sh
parm 1 11 
parm 2 22 
parm 3 33 
parm 4 44 
parm 5 55 
Here's the new first parameter: 33
显示参数的个数: 3
显示脚本的全部参数: 33 44 55
脚本运行的当前进程ID号: 2470
显示前一命令运行后状态: 0

例子2
hzmct@U-64:/study/linuxtest/day03$ cat find.sh 
#!/bin/bash
#使用方法./find.sh  "*.sh"
find ./ -name "$1" -print

执行脚本
hzmct@U-64:/study/linuxtest/day03$ ./find.sh "*.sh"
./testdir1.sh
./weizhibianliang.sh
./weizhi_.sh
./find.sh
./testdir.sh
./read.sh
./readonline.sh
./1.sh
./exec.sh

标准变量

//家目录
$ echo  $HOME
/home/hzmct
//登录用户
$ echo  $LOGNAME
hzmct
//终端类型
$ echo $TERM
xterm
//环境变量
$ set | grep "PATH"
//邮箱
$ echo $MAIL
/var/mail/hzmct

//PS1 提示符 
//PS1=’[\u@\h \w] \$’  u代表用户名 h主机名 w代表当前目录

$ echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$

//PS2 “> ”  大尖括号+空格 在一行上面运行多个命令
//一条命令没有写完,自动换行后,shell提示符
hzmct@U-64:/study/linuxtest/day03$ echo $PS2
>
hzmct@U-64:/study/linuxtest/day03$ ls -lt | \
> wc -l
13
hzmct@U-64:/study/linuxtest/day03$

特殊变量

$# 传递到脚本的参数个数
   $* 以一个单字串显示所有向脚步传递的参数,与位置变量不同,次选项参数可以超过9个。
   $$    脚步运行的当前进程ID号
   $! 后台运行的最后一个进程的进程ID$@$#相同,但是使用时加引号,并在引号中返回每个参数
   $- 显示shell使用的当前选项,与set命令功能相同 
   $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

影响变量的命令

declare

hzmct@U-64:/study/linuxtest/day03$ help declare
      -f    restrict action or display to function names and definitions 只显示函数名

      -g    create global variables when used in a shell function; otherwise ignored
      -p    display the attributes and value of each NAME

    Options which set attributes:
      -a    to make NAMEs indexed arrays (if supported)
      -A    to make NAMEs associative arrays (if supported)
      -i    to make NAMEs have the `integer' attribute
      -l    to convert NAMEs to lower case on assignment
      -n    make NAME a reference to the variable named by its value
      -r    to make NAMEs readonly(设置变量只读)
      -t    to make NAMEs have the `trace' attribute
      -u    to convert NAMEs to upper case on assignment
      -x    to make NAMEs export(声明环境变量)

 --------------------------示例----------------------------
//声明一个整型变量
$ declare -i num=12

//查看整型变量
$ declare -p num
declare -i num="12"

//声明数组变量
$ arr[0]=x
$ arr[1]=y
$ declare -a arr[2]=z
查看数组
$ echo ${arr}
x
$ echo ${arr[2]}
z
$ echo ${arr[8]}

//声明环境变量
$ declare -x t=123

//声明变量只读属性
$ declare -r t=123
$ t=55

-bash: t: readonly variable

//查看所有变量属性
$ declare -p

//查看指定变量属性
$ export AA="12345"
$ declare -p AA
declare -x AA="12345"

export

export: export [-fn] [name[=value] ...] or export -p

    Options:
      -f    refer to shell functions
      -n    remove the export property from each NAME
      -p    display a list of all exported variables and functions

    An argument of `--' disables further option processing.

   export 用户创建传给shell的变量,即:创建环境变量
   -- 表明选项结束,所有后续参数都是实参
   -f  表明在“名-值”对中的名字是函数名。
   -n  把全局变量转换成局部变量。换句话说,命令的变量不在传给shell
   -p  显示全局变量列表

//使用export将局部变量转化为全局变量
//先定义一个局部变量
hzmct@U-64:/study/linuxtest/day03$ var2="i am global now"
//声明为全局变量
hzmct@U-64:/study/linuxtest/day03$ export var2
//启动子shell
hzmct@U-64:/study/linuxtest/day03$ sh
$ echo $var2
i am global now
//退出子shell
$ exit
hzmct@U-64:/study/linuxtest/day03$ echo $var2
i am global now
//将全局变量转化为局部变量
hzmct@U-64:/study/linuxtest/day03$ export -n var2
hzmct@U-64:/study/linuxtest/day03$ sh
$ echo $var2

$ exit
hzmct@U-64:/study/linuxtest/day03$ 

readonly

readonly    用于显示或者设置只读变量
   --  表明选项结束
   -f  创建只读变量

set

set 使用set命令显示所有本地定义的shell变量。
   设置或者重设各种shellset -a

env

env 查看所有环境变量。

shift

shift [n]   用于移动位置变量,调整位置变量,是$3的值赋予$2,$2的值赋予$1

typeset

typeset 用于显示或设置变量
   是declare的同义词

unset

unset   用于取消变量的定义
   --  表明选项结束
   -f  删除只读变量,但不能取消从shell环境中删除指定的变量和函数。如:PATH,PS1,PS2,PPID,UID,EUID等的设置
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值