liujijiang

Shell基础知识学习笔记

2020.05.25

Linux

目录结构:
/ 目录下:

  • bin(binary):二进制缩写,存放常用命令
  • boot:核心文件
  • dev(device):设备,存放Linux的外部设备
  • etc:配置文件和子目录
  • lib:系统运行需要的动态共享库
  • media:如果有U盘或者光驱会在这个目录下挂载
  • root:系统超级管理员的主目录
  • tmp:存放临时文件
  • usr:存放应用程序和一下文件
  • usr/bin:用户的应用程序
  • var:存放不断扩充的东西,如日志文件

Shell

C语言所写的程序,是用户使用Linux的桥梁,在内核层和用户层之间

shell脚本:为shell编写的脚本

shell脚本的执行需要脚本解释器

shell脚本解释器种类:

  • Bourne Shell(/usr/bin/sh)
  • Bourne Again Shell(/usr/bash):Bash
    。。。

Bash为免费的,被广泛使用

查看系统用的解释器:

echo $SHELL

列出所有已经安装的SHELL:

cat /etc/shells

进入Bash环境:

bash

退出Bash环境:

exit

当前目录:

pwd

2019年Bash分布了5.0版本,查看版本:

bash --version

shell 命令:

echo:在屏幕输出文本

echo hello word

-n:取消换行

echo -n hello word

export:输出的变量会成为子shell的环境变量

export a=1
bash
echo $a

命令格式:

command [arg1,arg2,...]
command:命令或者可执行文件
arg:参数

参数分为短形式和长形式:

ls -l

ls --list

他们是完全一样的,长形式便于理解

分号 ;:

表示一个命令的结束,所以可以在一行执行多个命令

clear; ls -l

&&和||:

&&:只有前面的命令成功执行,后面的才会执行
||:只有前面的命令执行失败,后面的才会执行

mkdir test && cd test

只有成功创建了test,才会执行后面的命令

cd test1 || mkdir test1

如果没有test1文件夹,才会创建文件夹

type:检查一个命令是shell内置命令还是外部程序

type echo && type ls

快捷键:

  • Ctrl+l:清空屏幕
  • Ctrl+c:停止正在执行的命令
  • Ctrl+U:删除光标之前内容
  • Ctrl+K:删除光标之后内容
  • Ctrl+D:关闭会话
  • Tab:自动补全命令
  • 连续两次Tab:查看所有可以补全的命令

部分扩展:

  1. '~' :当前用户主目录

echo ~

cd ~/test

  1. '?' :表示任意单个字符,不包括零个字符

ls ?.txt

  1. ' * ' :任意数量任意字符,可以为零个,不会匹配隐藏文件(.开头的文件)

ls *.txt

ls .*
列出所有隐藏文件

env:列出所有环境变量

Bash变量名区分大小写:HOME和home是两个变量

查看单个变量:

echo $HOME

定义变量

blog_name="liuxiansen"

使用变量:变量名前加 $ ,可以加上{} 确定边界

$blog_name

$

只读变量:readonly 命令使得变量只读

blog_name="liuxiansen"

readonly blog_name

删除变量:unset 命令删除变量,无法删除只读变量

unset blog_name

字符串:单引号和双引号或者没有引号都可以
单引号:引号内变量无效,原模原样输出
双引号:可以有变量,可以有转义字符

website='redarm.cn'

declare:声明特殊变量

  • -a:数组变量
  • -i:整型变量
  • -r:只读变量,等于readonly
  • -u:变量自动转为大写字母
  • -l:变量自动转为小写字母

declare -i a=1 b=2

let:声明变量时可以带表达式

let a=2+1

'#' 字符串长度:

name="123"
echo $

脚本

编写test.sh文件,在目录下./test.sh就可执行脚本文件

#!:告诉系统用什么解释器执行脚本

#!/bin/bash

如果脚本指定了解释器:#!/bin/bash,./test.sh就可以执行
如果脚本没有指定解释器,bash ./test.sh 执行

执行脚本前需要赋予权限,使脚本具有执行权限:
所有用户执行权限:chmod +x ./test.sh
拥有者所有权限,其他人读和执行权限:chmod 755 test.sh
只有拥有者可以执行:chmod 700 test.sh

执行脚本时需要带有脚本路径:
比如当前路径下 ./ ,或者是全局路径
如果脚本路径在环境变量$PATH指定的目录中,就不需要指定路径了

系统级环境变量配置文件:/etc/profile ,系统启动就加载的配置文件,所有用户都可以使用

用户的环境变量配置文件:~/.bash_profile ,用户自己的配置文件

把自己创建的 ~/bin 文件夹下的所有可执行文件加到环境变量中:

export PATH=$PATH:~/bin

:表示追加到原来的文本后面,然后所有的内容赋值给PATH

所有这就是为什么你装一个工具比如java,maven需要配置环境变量了,如果你想在命令行中直接使用java,mvn命令,你就需要把他们的脚本文件路径配置到PATH中,否则你就需要每次都带上全局路径

export UTIL_PATH=/root/maven
export PATH=$PATH:$UTIL_PATH/bin

配置完后需要重新加载配置:

source ~/.bash_profile

env:定义脚本执行需要用到的环境变量

#!/usr/bin/env node

当前shell脚本可以使用node命令

'#' :注释

脚本参数:执行脚本时可以带很多参数

脚本中使用传进的参数:

  • $0:脚本名
  • $1-$9:指向第1-9个参数
  • $#:参数个数
  • $@:全部参数

rm -rf test

$0:rm,$1:-rf,$2:test

循环输出命令的参数

#!/bin/bash

for i in "$@"; do
        echo $i
done

shift:去除第一个参数,使得第二个参数变成第一个参数

循环输出参数:

#!/bin/bash

while [ "$1" != "" ]; do
        echo "have $# args"
        echo "arg: $1"
        shift
done

exit:退出脚本,exit 0成功退出,exit 1脚本执行失败

source:执行一个脚本,一般用于重新加载配置脚本文件

或者:在脚本里可以加载一个脚本文件,然后就可以使用脚本文件里的函数
可以简写为一个 .

source ./test.sh

alias:别名

read:脚本执行过程中接受用户输入

#!/bin/bash
echo enter some word
read text
echo "your text: $text"

输入文件名,输出文件,> 将文件导向read命令,读一行,输出一行

#!/bin/bash
echo enter a textfile
read filePath

if $filePath = ""; then
        exit 1
fi

while read line
do
        echo $line
done < $filePath

read参数:

  • -t:读取超时时间,秒为单位
  • -p:指定用户输入提示信息
  • -n:指定读取几个字符