Shell简介

Shell 是一个 C 语言编写的脚本语言,它是用户与 Linux 的桥梁,用户输入命令交给 Shell 解释处理Shell 将相应的操作传递给内核(Kernel),内核把处理的结果输出显示到屏幕给用户.

Shell分为两类

图形界面 Shell(GUI Shell)

GUI为 Unix 或者类 Unix 操作系统构造一个功能完善、操作简单以及界面友好的桌面环境。主流桌面环境有 KDE,Gnome 等。

命令行界面 Shell(CLI Shell)

CLI是在用户提示符下键入可执行指令的界面,用户通过键盘输入指令,完成一系列操作。

在 Linux 系统上主流的 CLI 实现是 Bash,是许多 Linux 发行版默认的 Shell。还有许多 Unix 上Shell,例如 tcsh、csh、ash、bsh、ksh 等。

如何查看系统支持的shell

一个系统中可以存在多个shell,可以通过cat /etc/shells命令查看系统中安装的shell,不同的shell可能支持的命令语法是不相同的,但是最常用的shell还是/bin/bash

cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
Shell命令基本格式

shell命令可以分为两大类

  • 一类是内置命令,即系统自带的命令,如ls,这是显示文件夹下文件的命令;

  • 另一类是外置命令,如vi,是调用vi编辑器的命令,而vi编辑器是一个软件,这类命令由独立的程序实现的命令,用于对linux的扩展,是外置命令

shell命令格式如下

命令名 [选项] <参数1> <参数2>…
# 方括号内为可选的,命令可能有0个或者多个参数。
系统变量

在命令行提示符直接执行 env、set 查看系统或环境变量。env 显示用户环境变量,set 显示 Shell预先定义好的变量以及用户变量。可以通过 export 导出成用户变量。

一些写Shell脚本时常用的系统变量

$SHELL  默认 Shell
$HOME 当前用户家目录
$IFS 内部字段分隔符
$LANG 默认语言
$PATH 默认可执行程序路径
$PWD 当前目录
$UID 当前用户 ID
$USER 当前用户
$HISTSIZE 历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间
$RANDOM 随机生成一个 0 至 32767 的整数
$HOSTNAME 主机名
普通变量与临时环境变量

普通变量定义:VAR=value

临时环境变量定义:export VAR=value

变量引用:$VAR

下面看下他们之间区别:

Shell 进程的环境变量作用域是 Shell 进程,当 export 导入到系统变量时,则作用域是 Shell 进程及其 Shell 子进程。

Shell 进程的环境变量作用域是 Shell 进程,当 export 导入到系统变量时,则作用域是 Shell 进程及其 Shell 子进程。

ps axjf 输出的第一列是 PPID(父进程 ID),第二列是 PID(子进程 ID)当SSH 连接 Shell 时,当前终端 PPID(-bash)是 sshd 守护程序的 PID(root@pts/0),因此在当前终端下的所有进程的 PPID 都是-bash 的 PID,比如执行命令、运行脚本。

所以当在-bash 下设置的变量,只在-bash 进程下有效,而-bash 下的子进程 bash 是无效的,当export 后才有效。

进一步说明:再重新连接 SSH,去除上面定义的变量测试下所以在当前 shell 定义的变量一定要 export,否则在写脚本时,会引用不到。

还需要注意的是退出终端后,所有用户定义的变量都会清除。

在/etc/profile 下定义的变量就是这个原理.

位置变量

位置变量指的是函数或脚本后跟的第 n 个参数。

1−1−n,需要注意的是从第 10 个开始要用花括号调用,例如${10}

shift 可对位置变量控制,例如:

#!/bin/bash
echo "1: $1"
shift
echo "2: $2"
shift
echo "3: $3" sh test.sh 1 2 3
1: 1
2: 3
3:
# 每执行一次 shift 命令,位置变量个数就会减一,而变量值则提前一位。shift n,可设置向前移动n位。
特殊变量
$0  # 脚本自身名字
$? # 返回上一条命令是否执行成功,0 为执行成功,非 0 则为执行失败
$# # 位置参数总数
$* # 所有的位置参数被看做一个字符串
$@ # 每个位置参数被看做独立的字符串
$$ # 当前进程 PID
$! # 上一条运行后台进程的 PID
变量引用
赋值运算符 示例
= 变量赋值
+= 两个变量相加
自定义变量与引用
a=123
echo $a
123 a+=456
echo $a
123456 # Shell 中所有变量引用使用$符,后跟变量名 # 有时个别特殊字符会影响正常使用,就需要使用${a},例如
[root@redis ~]# b=123
[root@redis ~]# echo $b
123
[root@redis ~]# echo ${b}
123
# 有时个别特殊字符会影响正常引用,那么需要使用${VAR}
[root@redis ~]# echo $b123 [root@redis ~]# echo ${b}123
123123 # 将命令结果作为变量值
[root@redis ~]# c=`echo 123`
[root@redis ~]# echo $c
123
[root@redis ~]# c=$(echo 123)
[root@redis ~]# echo $c
123 # 这里的反撇号等效于$(),都是用于执行 Shell 命令。 # 单引号和双引号
[root@redis ~]# d=1
[root@redis ~]# d="1 2 $d"
[root@redis ~]# echo $d
1 2 1
[root@redis ~]# c=1
[root@redis ~]# c='1 2 $c'
[root@redis ~]# echo $c
1 2 $c
# 单引号是告诉 Shell 忽略特殊字符,而双引号则解释特殊符号原有的意义,比如$ 、 !。
shell命令小知识

1.shell自动补齐和历史记录

shell会在用户输入命令前几个字母后按 键自动补齐,如果有多个候选命令会显示出全部命令。

shell会自动记录用户使用的命令,用户可以按 上 下 键 来查看。

2.shell提示符

shell提示符有两种,一种是 $结尾,为普通用户权限下的提示符号,一种是#结尾,为管理员权限,用户可以用su命令切换用户,如下图:

3.输入输出重定向

shell命令是控制台命令,使用标准输入和输出设备,即从键盘接受输入,将结果显示在显示器上。重定向可以将shell的输入输出重定向到文件或设备。

输入重定向符号为”<”,输出重定向符号为”>”和”>>”。如果shell命令 “X”在执行过程中,需要从控制台获得数据,那么执行”X < file”可以从file文件中获得所需数据。如果X在执行过程中产生数据,可以用 “X > file”和”X >> file”将结果输入到文件。”>”为覆盖输入,”>>”为追加输入

4.管道

linux系统中,管道是一种先进先出的单数据通道,利用管道符号”|”可以将多个命令组合到一起,把一个命令的输出传递给下一个命令作为输入,最终得到经过多个命令一次处理的结果。如,用ll和grep结合来查找当前目录是否有这个文件:

什么是Shell脚本

脚本就是shell命令组成的文件,这些命令都是可执行程序的名字,脚本不用编译即可通过解释器解释运行。

 它是一种解释型语言,我们可以用shell脚本操存执行动作,用脚本判定命令的执行条件,用脚本来实现动作的批量执行

Shell简单使用

脚本开头

为了便于脚本的使用者可以快捷的了解到脚本的用途与其使用的解释器,通常我们需要在脚本的开头加上注释。

#!/bin/bash		 脚本使用的解释器,通常用幻数“#!”指定
# Autho: 脚本作者
# Create_date 脚本创作时间
# Mail: 脚本作者联系方式
# Description: 脚本作用解释
# Version: 脚本的版本
脚本内容

在shell脚本中可以出现任何系统命令,输入你想要执行的命令即可,我们创建一个hello.sh

cat hello.sh
#!/bin/bash 脚本使用的解释器,通常用幻数“#!”指定
# Autho: 脚本作者
# Create_date 脚本创作时间
# Mail: 脚本作者联系方式
# Description: 脚本作用解释
# Version: 脚本的版本
echo hello
shell脚本的执行方法

首先我们给脚本执行权限

chmod +x 脚本路径/脚本名

执行方式1: 输入脚本的绝对路径或者相对路径

# 注意: 如果不给+x权限是不能这种方式执行脚本的
# 绝对路径
/root/test.sh
hello # 相对路径
./test.sh
hello

执行方式2: sh +脚本

sh /root/test.sh
hello

执行方式3: source + 脚本

source /root/test.sh
hello

执行方式4: . + 脚本

 . test.sh
hello

区别

# 第一种和第二种会新打开一个bash,不同bash中的变量无法共享,
# 第三种和第四种是直接使用当前运行环境作为解释器运行环境

01 . Shell详细入门介绍及简单应用的更多相关文章

  1. linux基础之Shell Script入门介绍

    本文介绍下,学习shell script编程的入门知识,通过几个入门实例,带领大家走进shell script的神圣殿堂,呵呵,有需要的朋友参考下. 本文转自:http://www.jbxue.com ...

  2. javascript笔记01:javascript入门介绍

    javascript是实现网页动态效果的基石,在web开发中扮演重要的角色,被广泛应用的各个领域 (1)网页游戏 (2)地图搜索 (3)股市信息查询 (4)web聊天 …………

  3. Java自动化测试框架-01 - TestNG之入门篇 - 大佬的鸡肋,菜鸟的盛宴(详细教程)

    TestNG是什么? TestNG按照官方的定义: TestNG是一个测试框架,其灵感来自JUnit和NUnit,但引入了一些新的功能,使其功能更强大,使用更方便. TestNG是一个开源自动化测试框 ...

  4. 【转载】salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)

    salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)   salesforce中对于数据库操作和JAVA等语言对于数据库操作是有一定区别的.salesfo ...

  5. shell的select脚本的简单入门

    shell的select脚本的简单入门 语法:select var in ...;do break;doneecho $var 示例: #/bin/bash echo "what is yo ...

  6. shell的case脚本的简单入门

    shell的case脚本的简单入门 示例1: #/bin/bash a=$ case "$a" in ") echo 'hell 2';; ") echo 'h ...

  7. ant使用指南详细入门教程

    这篇文章主要介绍了ant使用指南详细入门教程,本文详细的讲解了安装.验证安装.使用方法.使用实例.ant命令等内容,需要的朋友可以参考下 一.概述 ant 是一个将软件编译.测试.部署等步骤联系在一起 ...

  8. <转载>ant使用指南详细入门教程 http://www.jb51.net/article/67041.htm

    这篇文章主要介绍了ant使用指南详细入门教程,本文详细的讲解了安装.验证安装.使用方法.使用实例.ant命令等内容,需要的朋友可以参考下 一.概述 ant 是一个将软件编译.测试.部署等步骤联系在一起 ...

  9. 【翻译转载】【官方教程】Asp.Net MVC4入门指南(1): 入门介绍

    1. Asp.Net MVC4 入门介绍 · 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/ ...

随机推荐

  1. 【HBase】HBase架构中各种组件的作用

    client: 发起读写请求 维护cache,加快读取速度 zookeeper: HMaster选举,存储meta-region的路由信息,监控集群从节点HRegionSever上信息 HMaster ...

  2. webpack+vue2.0项目 (二)热加载,vue-router

    目录创建好之后,命令行输入 npm run dev 因为在配置文件config/index.js里: dev: { env: require('./dev.env'), port: 8080, aut ...

  3. 这才是你需要的最基础的.Net基础面试题(通俗易懂,最基础的.Net)2

    51. 委托回调静态方法和实例方法有何区别? 当一个实例方法被调用时,需要通过实例对象来访问,绑定一个实例方法到委托必须同时让委托得到实例方法的代码段和实例对象的信息,这样在委托被回调时候.NET才能 ...

  4. Java实现 LeetCode 912 排序数组(用数组去代替排序O(N))

    912. 排序数组 给你一个整数数组 nums,将该数组升序排列. 示例 1: 输入:nums = [5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:nums = [5,1,1,2,0, ...

  5. Java实现 蓝桥杯 历届试题 小计算器

    历届试题 小计算器 时间限制:1.0s 内存限制:256.0MB 问题描述 模拟程序型计算器,依次输入指令,可能包含的指令有 1. 数字:'NUM X',X为一个只包含大写字母和数字的字符串,表示一个 ...

  6. Java实现 LeetCode 365 水壶问题

    365. 水壶问题 有两个容量分别为 x升 和 y升 的水壶以及无限多的水.请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水? 如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水. ...

  7. Java实现 LeetCode 188 买卖股票的最佳时机 IV

    188. 买卖股票的最佳时机 IV 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 k 笔交易. 注意: 你不能同时参与多 ...

  8. Java实现 蓝桥杯VIP 算法提高 不同单词个数统计

    算法提高 不同单词个数统计 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,输入一个句子,然后统计出这个句子当中不同的单词个数.例如:对于句子"one little t ...

  9. Java实现第十届蓝桥杯质数

    试题 D: 质数 本题总分:10 分 [问题描述] 我们知道第一个质数是 2.第二个质数是 3.第三个质数是 5--请你计算 第 2019 个质数是多少? [答案提交] 这是一道结果填空的题,你只需要 ...

  10. 逐行解读HashMap源码

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 一.写在前面 相 ...