【Linux学习】之 Shell初识

Shell 的 历史:

- 1977年 Bourne Shell发布,并作为UNIX 7的默认Shell。
- 由于BourneShell 一直没有正式的版本号且交互性不好, 加州大学伯克利分校的一名学生编写了 C Shell,由于不支持正则表达式,so没在UNIX中广泛使用。
- 20世纪80年代初,出现了Korn Shell,成为AIX4上的默认的Shell
- 20世纪80年代末,出现了Bash Shell,作为GNU项目免费公布使用。

查看下系统的Shell 及其 版本吧。(Ubuntu 16)

这里写图片描述




一、第一个Shell脚本


(1)编写脚本
// Shell 脚本永远是以 #! 开头,这是一个脚本开始的标记。
#! /bin/bash
# THis Line is a comment
echo "Hello World"

这里写图片描述


(2)运行脚本
① bash
// 直接bash 一个文件就是指定了使用 Bash Shell来解释脚本内容
bash HelloWorld.sh

这里写图片描述

② 使用 “./”
// ./ 表示运行的是当前目录下的HelloWorld.sh脚本
// (如果采用这种方式而脚本没有可执行权限则会报错)
./HelloWorld.sh

// 添加权限
// 只授予这个文件的所属者执行的权限 
chmod +x HelloWorld.sh
./HelloWorld.sh

这里写图片描述

如果想该脚本成为默认的系统命令

简单地将该脚本复制到任意系统$PATH变量所包含的目录中,同时赋予可执行权限。

比如:
chmod +x HelloWorld.sh
mv HelloWorld.sh /bin/
HelloWorld.sh


(3)脚本排错








二、Shell的内建命令


所谓Shell内建命令,就是由Bash自身提供的命令,而不是文件系统中的某个可执行文件。

(自身所拥有的能力,而不是通过外部)
比如:bash, :, .,[ ,alias,bg,bind,break,builtin,cd,command。。。

常用的内建命令


(1)如何确认内建命令:type
// cd 是内建命令
type cd 

// ifconfig 不是内建命令,是外部文件
type ifconfig

这里写图片描述


(2)执行程序: ” . ”

用于执行某个脚本,甚至脚本没有可执行权限也可以运行。

// 如果脚本没有可执行权限,则会报权限错误
./Hello.sh

// 使用点号执行没有加执行权限的脚本可以正常运行
. ./Hello.sh


(3)别名:alias

alias可用于创建命令的别名,若直接输入该命令且不带任何参数,则列出当前用户使用了别名的命令。

比如:ll 等于 ls -l

// 查看当前命令的别名
alias

// 使用alias 定义别名
alias la='ls -a'

// 为使永久生效,可以将该条目写到用户家目录中的    .bashrc   文件中。
cat .bashrc

// 删除别名:unalias
unalias ll

这里写图片描述

这里写图片描述

这里写图片描述


(5)任务前后台切换:bg、fg、jobs

比如打包某个占用较大空间的目录,若在前台执行,在任务完成前将会一直占用当前的终端,而导致无法执行其他任务,此时就应该将这类任务放置后台。

// 查找
find /etc -name *.deb

// 暂停前台任务
CTRL + z

// 查看暂停的任务
jobs

// 把任务放在后台继续运行
bg 1

// 把任务放在前台继续运行
fg 1

// 一开始就将命令调制后台运行(&)
find /etc -name *.deb &

这里写图片描述


(6)cd

改变当前工作目录。如果不加参数,默认会进入当前用户家目录。


(7)声明变量:declare 、typeset

两个命令一样,都是用来声明变量的。

// 弱类型, 不用指明类型
i=1

// 若使用declare命令,可以用 -i 参数声明整型变量
declare -i i=4

// -r 只读
declare -r readonly=100

// -a
declare -a arr='([0]="a" [1]="b" [2]="c")'

这里写图片描述


(8)echo

用于打印字符。该命令会打印出引号中的内容,并在最后默认加上换行符。

// -n 命令提示符在同一行
echo -n "Hello World"

// -e 允许答应转义字符
echo -e "\n"

这里写图片描述


(9)跳出循环:break

从一个循环(for、while、until或者select)中退出。
break n
//表示跳出n层循环(n >= 1)

break

break n


(10)循环控制:continue

停止当前循环,并执行外层循环(for、while、until或者select)的下一次循环。

continue

continue n


(11)声明局部变量:local

该命令用于在脚本中声明局部变量,典型用法是用于函数体内。
如果在函数外使用local声明变量,则会提示错误


(12)从标准输入读取一行到变量:read
#!/bin/bash
declare N

echo "12 bottles of beer in a box"
echo -n "How many box do you want : "
read N

echo "$((N * 12)) bottle in total"

这里写图片描述

Tips

如果不指定变量,read命令会将读取的值放入环境变量REPLY中。
(read是按行读取的,用回车符区分。)

这里写图片描述


(13)向左移动位置参数:shift
参数说明
$0脚本名本身
$1 (2 3 … n)脚本的第一个参数,第二个参数……第n个参数
$#变量总数
$*显示所有参数
$@显示所有参数
$?前一个命令的退出的返回值
$!最后一个后台进程的ID号
// 从左往右第一个参数:$1,第二个:$2 。。。$N
// 所有参数记作 $@ 或 $*
// 参数的总个数记作 $#
// 脚本本身记作 $0

// 下面是代码

#!/bin/bash
echo "This script's name is : $0"
echo "The First parameter is : $1"
echo "The Second parameter is : $2"
echo "The Third parameter is : $3"
echo "All of the parameters are $@"
echo "All of numbers : $#"

这里写图片描述

shift 可以对参数做偏移
#!/bin/bash
until [ -z "$1" ]
do 
    echo "$@ "
    shift

done

这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 使用date命令显示当前日期。 2. 使用 who命令显示当前所有登录用户的信息,试依次打开多个终端,再查看输出结果的变化。 3. 查看当前linux服务器的主机名的命令。(hostname) 4. 使用clear命令,清除屏幕信息。 5. 添加一个组账号,名称为group1,打开图形界面观察执行后的结果。 6. 查询文件group中group1的记录,改变group1组的GID 为666, 再查看文件group中group1的记录。 7. 以自己的姓名全拼创建一个用户,指定UID为555, 加上用户的备注信息(姓名全称、所在院系等),初始组为group1,有效组为root,打开图形界面观察执行后的结果。 8. 为以自己姓名命名的账户设置密码,并查看passwd文件和shadow文件的最后一行。 9. 使用命令给自己的姓名账户密码冻结,用passwd查看账户相关信息,最后给账户解冻。 10. 进入以自己姓名命名的用户主目录,显示当前的路径,退出当前目录,返回根目录。 11. 复制文件/etc/passwd到用户主目录,文件名不变,打开图形界面Nautilus的窗口观察执行后的结果。 12. 统计文件/etc/passwd文件的字节数和行数。 13. 创建普通文件/home/abc1,创建普通文件/home/abc2。 14. 将/etc/passwd的内容追加到文件abc1中,将/etc/group的内容追加到文件abc2中。(利用附加输出重定向命令)。 15. 修改文件abc1的属性为:属主具有一切权限,同组用户和其他用户具有可读可写的权限。(使用数字模式) 16. 修改abc2的属性为:给其他用户增加可执行的权限。(使用功能模式) 17. 以长文件形式显示文件abc1的详细信息。 18. 进入/home目录,将文件abc1和abc2打包成文件ab.tar,放在以自己姓名命名的用户主目录下(比如/home/liqun),打开图形界面Nautilus的窗口观察执行后的结果。 19. 创建Readme.txt文本文件,内容为你的姓名全拼、学号等信息,保存关闭后用命令查看Readme.txt文件的内容,并在每一行前加行号。 20. 在root目录下创建新文件夹mydir1,其绝对路径为“/root/testdir/mydir1”(假设testdir目录事先并不存在)。 21. 在root目录下创建新文件夹dir1,将其移动到 /root/testdir/mydir1目录下。在root目录下创建新文件夹dir2,将其移动到 /root/testdir目录下,并将其改名为mydir2。打开图形界面Nautilus的窗口,观察以上这些步骤执行后的结果。 22. 分别删除/testdir目录下的mydir1和mydir2目录。(注意rm命令不加-r选项,系统会提示mydir1是个目录不能删除。)(尝试重复步骤20和步骤21,重建上述目录,执行步骤22,比较增加-f选项的区别)。 23. 建立文件/etc/group的符号链接文件/root/a.b,打开图形界面Nautilus的窗口观察a.b文件的特征。 24. 进入根目录的tmp目录下,建立test1和test2两个文件夹,在test1中建立文件a.log, b.log,用ls命令查看所创建的文件a.log,b.log。再把a.log 硬连接到test2目录,文件同名。把b.log 软链接到test2目录下,文件同名。用ls命令查看test2文件夹下所创建的文件,并打开图形界面Nautilus的窗口观察文件夹test2下a.log文件和b.log文件的特征。 25. 由超级用户切换为以自己姓名命名的普通用户身份,并使用普通用户的环境变量,再切换回超级用户身份。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值