Linux学习闲谈(一)——Shell基本操作与命令

Linux学习闲谈(一)

——Shell基本操作与命令

(转载请附上本文链接——linhxx)

1、#!/bin/sh

放在程序开头,表示用/bin/sh方式来解析。

2、变量

1)变量赋值 varname=’xxx’,除了在变量赋值和在FOR循环语句头中,其他情况下BASH 中的变量使用必须在变量前加"$"符号,即采用 $varname使用变量。更为标准的变量引用方式是 ${STR} 这样的,$STR 自不过是对 ${STR} 的一种简化。在复杂情况下(即有可能产生歧义的地方)最好用带 {} 的表示方式。

2)给变量赋值时,等于号=两边都不能有空格。

3)local定义局部变量,export定义全局变量。

4)保留变量:

$IFS  这个变量中保存了用于分割输入参数的分割字符,默认是空格。

$HOME  这个变量中存储了当前用户的根目录路径。

$PATH  这个变量中存储了当前 Shell 的默认路径字符串。

$PS1  表示第一个系统提示符。

$PS2  表示的二个系统提示符。

$PWD  表示当前工作路径。

$EDITOR 表示系统的默认编辑器名称。

$BASH  表示当前 Shell 的路径字符串。

$RANDOM 随机的生成一个大小在 1 到 65536 之间的整数。

5)变量的特殊操作:

${var-default} 表示如果变量 $var 还没有设置,则保持 $var 没有设置的状态,并返回后面的默认值 default。

${var=default} 表示如果变量 $var 还没有设置,则取后面的默认值 default。

${var+otherwise} 表示如果变量 $var 已经设置,则返回 otherwise 的值,否则返回空( null )。

${var?err_msg} 表示如果变量 $var 已经设置,则返回该变量的值,否则将后面的 err_msg 输出到标准错误输出上。

${var#pattern},${var##pattern} 用于从变量 $var 中剥去最短(最长)的和 pattern 相匹配的最左侧的串。

${var%pattern},${var%%pattern} 用于从变量 $var 中剥去最短(最长)的和 pattern 相匹配的最右侧的串。

${var:pos} 表示去掉变量 $var 中前 pos 个字符。

${var:pos:len} 表示变量 $var 中去掉前 pos 个字符后的剩余字符串的前 len 个字符。

${var/pattern/replacement} 表示将变量 $var 中第一个出现的 pattern 模式替换为 replacement 字符串。

${var//pattern/replacement} 表示将变量 $var 中出现的所有 pattern 模式全部都替换为 replacment 字符串。

3、&& 和  || 以及 |

1)a && b 表示先执行a,成功再执行b。

2)a||b表示执行a,成功就不执行b,否则执行b。

3)a|b 表示先执行a,执行的结果用在执行b的过程。

4、特殊符号

1)# 用于开头表示定义,用于其他行的行首表示本行注释不执行

2); 多个语句放在同一行用此分隔。

3);; 在使用case时,作为每个选项的结束。

 varname=b

 case "$varbname" in

  [a-z]) echo "abc";;

  [0-9]) echo "123";;

 esac

4)单引号和双引号:同php

5)` (反引号),将命令执行的结果输出到变量。

cp `mkdir back` test.sh back ,反引号中的先执行,然后执行拷贝cp命令。

6):

1. 空命令  bash的一个内建命令,退出码是0。与 true作用相同。

2. 变量扩展/字串替换  : > 文件   清空了这个文件  和 cat 、dev/null 文件  作用相同。但用 :不会产生新进程,因为是内建命令。

7)小括号 ()

1. 命令组,将括号内部的命令当做子shell,对脚本剩余部分不可用,变量存在作用域的问题。下列输出的结果是123,即小括号内的在小括号外没用。

a=123

( a=321;)

echo "a = $a"

2. 初始化数组:arr=(1 3 5 7 9)

8)大括号{}

1. 文件名扩展  cp t.{txt,bak}   复制 t.txt 的内容到 t.bak 中

2. 代码块,和小括号相反,大括号外面仍然可以使用里面的变量。下面输出321。

a=123

{ a=321;}

echo "a = $a"

9)中括号[]

1. if等条件放在中括号中 if [ $a -gt 10 ] ,方括号两边需要留空格。

2. 用来引用数组元素,同PHP

10)<、>与<<、>>

首先,两个符号和一个符号的相比,两个符号的是输出内容追加到文件后面,一个符号的意思是直接输出到文件(覆盖原来的内容)。

其次,符号表示重定向,大于小于用-gt和-lt。

例子:sort >>name.txt <<hello

1. sort >>name.txt  将sort命令的结果屏蔽输出并重定向追加到name.txt文件尾部(重定向标准输出)。

2. name.txt<<hello执行name.txt,以hello作为所需要的输入内容(重定向标准输入)。

附加内容:

linux输入输出三种标准:标准输入、标准输出、标准错误输出,分别是0/1/2,组合起来使用是 sort > name.txt  即sort 1> name.txt,但是要讲错误输出则用sort 2> name.txt,会把内容输出到name.txt。如果要同时将标准输出和标准错误输出都输出,则需要sort > name.txt 2>& 1,或者使用sort >& name.txt。

11) .

读取并执行.sh文件,且是在当前shell下执行(./xxx.sh是在子shell下执行)

5、$

1)$$ 当前Shell进程的ID

2)$0 当前脚本的文件名

3)$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。最多到9,第十个无法用$10获取,需要存储$1以后,用shift命令把第一个变量剔除,则此时$9就是输入的第十个变量。

4)$# 传递给脚本或函数的参数个数。

5)$* 传递给脚本或函数的所有参数。

6)[email protected] 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同。"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"[email protected]" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

7)$? 上个命令的退出状态,或函数的返回值。

6、判断

执行man test可以查看所有测试表达式可以比较和判断的类型。

-e 文件已经存在

-f 文件是普通文件

-s 文件大小不为零

-d 文件是一个目录

-r 文件对当前用户可以读取

-w 文件对当前用户可以写入

-x 文件对当前用户可以执行

-g 文件的 GID 标志被设置

-u 文件的 UID 标志被设置

-O 文件是属于当前用户的

-G 文件的组 ID 和当前用户相同

file1 -nt file2 文件 file1 比 file2 更新

file1 -ot file2 文件 file1 比 file2 更老

file1 -ef file2 文件 file1 是 file2 的硬链接

如 if [ -x /root ] 可以用于判断 /root 目录是否可以被当前用户进入

对应的操作 整数操作 字符串操作

相同 -eq =

不同 -ne !=

大于 -gt >

小于 -lt <

大于或等于 -ge

小于或等于 -le

为空 -z

不为空 -n ,建议使用 ! -z 代替

上次读过之后做过修改 -N

比如:

比较整数 a 和 b 是否相等就写做 if [ $a = $b ]

判断整数 a 是否大于整数 b 就写做 if [ $a -gt $b ]

比较字符串 a 和 b 是否相等就写作:if [ $a = $b ]

判断字符串 a 是否为空就写作: if [ -z $a ]

判断整数变量 a 是否大于 b 就写作:if [ $a -gt $b ]

注意:在“[”和“]”符号的左右都留有空格。

7、调试

sh -n your_script  不需要执行脚本只是检查语法的模式,返回所有语法错误。

sh -x strangescript 执行该脚本并显示所有变量的值。

8、[[]]与[]区别

1)数字测试: -eq -ne -lt -le -gt -ge,[[ ]]同 [ ]一致

2)文件测试: -r、-l、-w、-x、-f、-d、-s、-nt、-ot,[[ ]]同 [ ]一致

3)字符串测试: > < =(同==) != -n -z,不可使用“<=”和“>=”,[[ ]]同 [ ]一致,但在[]中,>和<必须使用\进行转义,即\>和\<

4)逻辑测试: []为 -a -o ! [[ ]] 为&& || !

5)数学运算: [] 不可以使用 [[ ]]可以使用+ - * / %

6)组合: 均可用各自逻辑符号连接的数字(运算)测试、文件测试、字符测试

两个使用时都需要用空格分隔运算符和值。

9、(())

专门来做数值运算,如果表达式求值为 0,则设置退出状态为 1;如果求值为非 0 值,则设置为 0。不需要对 (( 和 )) 之间的操作符转义。算术只对整数进行。除 0 会产生错误,但不会产生溢出。可以执行 C 语言中常见的算术、逻辑和位操作。

下面两种方法都输出100:

((i=1+99));echo $i

i=99;((i++));echo $i

这种方法下符号和值不要有空格,和[[]]不一样。

10、&

命令末尾的&,表示采用非阻塞的方式执行命令,即不必等待执行结果,可以一边执行该行命令一边往下执行。

11、函数

求函数的定义必须在函数使用之前。

函数参数的定义并不需要在函数定义处就制定,而只需要在函数被调用时用 BASH 的保留变量 $1 $2 ... 来引用就可以了。

BASH 的返回值可以用 return 语句来指定返回一个特定的整数,如果没有 return 语句显式的返回一个返回值,则返回值就是该函数最后一条语句执行的结果(一般为 0,如果执行失败返回错误码)。BASH 要求返回值必须为一个整数,不能用 return 语句返回字符串变量。

函数的返回值在调用该函数的程序体中通过 $? 保留字来获得。

例如:

square() {

let "res = $1 * $1"

return $res

}

square $1

result=$?

12、select

BASH 中提供了一个小的语句格式,可以让程序快速的设计出一个字符界面的用户交互选择的菜单,该功能就是由 select 语句来实现的,select 语句的语法为:

xxx=’a b c’

select var in $xxx

do

statments use $var

done

上面的语法结构在执行后,BASH 会将$xxx中的所有项加上数字列在屏幕上等待用户选择,在用户作出选择后,变量 $var 中就包含了那个被选中的字符串,然后就可以对该变量进行需要的操作了。

13、read

等待用户的输入,并将用户输入的结果作为变量。

read NAME

echo "Hi! $NAME !"

——written by linhxx

更多最新文章,欢迎关注微信公众号“决胜机器学习”,或扫描右边二维码。

原文地址:https://www.cnblogs.com/linhxx/p/8412858.html

时间: 2024-11-05 18:53:26

Linux学习闲谈(一)——Shell基本操作与命令的相关文章

Linux学习闲谈(三) ——SVN用法及切版本与合版本

Linux学习闲谈(三) --SVN用法及切版本与合版本 (转载请附上本文链接--linhxx) SVN(Subversion)在工程中运用广泛,多人合作项目.项目版本控制等方面,SVN都是不可或缺的.虽然最近很多项目也在使用Git,但SVN仍是现在流行的版本控制系统.SVN与Git相比,最大的一个优势是存在全局版本号. 一.概述 SVN分为客户端和服务端,即需要在一台大家都能访问到的服务器上安装SVN的服务端,然后各自的电脑里安装SVN的客户端.安装的过程这里不讲,有很多博客如http://w

Linux学习笔记一 磁盘管理常用命令

Linux学习笔记一 磁盘管理常用命令 Linux系统下,一切均是文件,磁盘是一种特殊的块设备文件. 常用的硬盘接口类型 并口:IDE ,SCSI 串口:SATA,SAS 磁盘设备文件设备文件的命令规则: IDE: 设备名为/dev/hda, /dev/hdb-.  (末尾的a ,b-代表不同的IDE硬盘) SCSI:设备名为/dev/sda, /dev/sdb-.(末尾的a,b-代表不用的SCSI硬盘 机械式硬盘: track: 磁道(盘面上由外向里划分成不同的磁道) cylinder: 柱面

Linux学习闲谈(二) ——SVN版本控制拾遗

  Linux学习闲谈(二) --SVN版本控制拾遗 (转载请附上本文链接--linhxx) 一.概念 仓库(repository)是代码总的存放的地方,工作副本(working copy)的每个开发者用于开发的地方.版本控制方法如下图: 两个开发者一起检出,其中一个开发完提交,另一个后提交的,必须先update最新的仓库,否则无法提交.检出后,后者可以提交.该解决方案称为"复制-修改-合并". 但是,对于图片等二进制文件,用加锁-修改-解锁模型更好.因此还要根据实际情况. 二.版本控

linux下MongoDB客户端shell基本操作

MongoDB 是一款NoSql数据库,没有固定的模式,即同一个集合中的不同文档结构可以不同,如:第一条记录{name:"xiaoming"},第二条记录:{name:"xiaoli",age:15},这在关系型数据库中是无法实现的.对于MongoDB,其中:collections即集合相当于关系型数据库的表,document文档相当于关系型数据库中的行.因此也就是说,MongoDB中的表中存储的数据可以不规定类型等.下面看一下MongoDB自带shell客户端的一

Linux学习笔记(3)-常用命令

江湖传言,Linux和Windows不同,他主要的用途是在一些服务器,或者片内系统上,所以人机交互界面自然就没有Windows那么漂亮,其实也没有那个必要. 所以,学习Linux的第一步,就是学习他那个命令行终端的使用方法. 按照教程上所讲,首先学习几个最为常用的命令: 1.ls ls这个命令就是显示当前文件夹下都有哪些东西 蓝色表示文件夹,白色表示文件,据说还有别的颜色,今后遇到在说吧! 在Linux下,命令是可以加参数的,比如,如在ls后面跟上-l,那就可以显示这些文件的详细信息 虽然现在还

Linux学习笔记(三)-Shell命令机制

切换命令行:ctrl+alt+f1-f6 切换到图形界面:ctrl+alt+f7 ls-list(win下的dir) 白色:普通文件 蓝色:目录文件 绿色:可执行文件 执行步骤: 输入ls 在相关目录下去找命令程序(path,环境变量:/etc/environment),whereis+命令:查找该命令的可执行文件的位置 基于shell的基本类库Bash 底层的交互 GNU,FSF,Bash,Coreutils 来自为知笔记(Wiz)

Linux学习笔记(十二)--命令学习(用户创建、删除等)

通过上面的几章学习,我们对linux有了一些了解,现在我们再继续进行下去.... 我们习惯的windows 界面系统中,只要在界面里去下鼠标,填写等这些就可以完成了一个用户创建.删除.添加所属组等,那我们在linux里又是怎么操作的呢??? 下面在学习如何使用命令进行一系列的操作时,我们要先了解一些别的: 在linux系统里除了我们要新建的用户外,还有一些特定的用户,我们称呼它为:伪用户. -----------------------------------------------------

Linux学习日记—使用Shell变量

Shell变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应的变化. [变量的作用] 为灵活管理Linux系统提供特定参数,而有两层意思: 1.变量名:使用固定的名称,由系统预设或用户自定义 2.变量值:能够根据用户设置,系统环境的变化而变化 [变量的类型] 1.自定义变量:由用户自己定义,修改和使用 2.环境变量:由系统维护,用于设置工作环境 3.位置变量:通过命令行给脚本程序传递参数 4.预定义变量:Bash中内置一类变量,不能直接修改 [自

嵌入式Linux学习笔记(0)基础命令。——Arvin

学习记录: 到今天为止ARM裸机开发学习进程:1.2.1-1.2.14 预科班知识Linux介绍学习进程:0.2.1-0.2.6 学习内容笔记: 学习了Linux的开发方式的优劣介绍 学习了常用文件夹命令 ls(list) ls -a 显示所有文件(包括隐藏文件) ls -l 显示所有详细信息 ls -a -l也可以 man(查询命令) man 1 ls(1表示查询命令,ls表示查询的内容) cd(change directory) cd ..代表上一层 cd ../../代表上上层 cd .是