Linux--shell

shell概念

参考链接
shell基础知识 (shell脚本的概述 、执行过程 、执行方法 、开发规范)

        什么是shell? 简单点理解,就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具。实际上,在shell和计算机硬件之间还有一层东西那就是系统内核了。打个比方,如果把计算机硬件比作一个人的躯体,而系统内核则是人的大脑,至于shell,把它比作人的五官似乎更加贴切些。

        回到计算机上来,用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。也就是说,shell是你(用户)和Linux内核之间的接口程序。你在提示符下输入的每个命令都由shell先解释然后传给Linux内核,如图所示:

        shell 是一个命令语言解释器(command-language interpreter),拥有自己内建的 shell 命令集。此外,shell也能被系统中其他有效的 Linux 实用程序 应用程序(utilities and application programs)所调用。Linux Bash内置命令大全  判断是否为内置bash指令

        不论何时你输入一个命令,它都被Linux shell所解释。一些命令,比如打印当前工作目录命令(pwd),是包含在Linux bash内部的(就象DOS的内部命令)。其他命令,比如拷贝命令(cp)和移动命令(rm),是存在于文件系统中某个目录下的单独的程序。而对用户来说,你不知道(或者可能不关心)一个命令是建立在shell内部还是一个单独的程序。

例子:在V3的shell中试验指令,总结:有些指令需要切换到su模式下才有权限使用

rk3326_atv:/ $ mount -o remount,rw /
mount: 'rootfs' not user mountable in fstab
Mount: 'rootfs'不是fstab中的用户可挂载的

130|rk3326_atv:/ $ cat > data/xiaocai.txt                                      
/system/bin/sh: can't create data/xiaocai.txt: Permission denied

luckystar@luckystar-Lenovo-Rescuer-15ISK:~$ su
Password: 
su: Authentication failure(身份验证失败)

        shell 首先检查命令是否是内部命令,不是的话再检查是否是一个应用程序,这里的应用程序可以是Linux本身的实用程序,比如 ls 和 rm,也可以是购买的商业程序,比如 xv,或者是公用软件(public domain software),就象 ghostview。然后shell试着在搜索路径($PATH)里寻找这些应用程序。搜索路径是一个能找到可执行程序的目录列表。如果你键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。而如果命令被成功的找到的话,shell的内部命令或应用程序将被分解为系统调用并传给Linux内核。 

        shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell 程序设计语言支持在高级语言里所能见到的绝大多数程序控制结构,比如循环,函数,变量和数组。shell 编程语言很易学,并且一旦掌握后它将成为你的得力工具。任何在提示符下能键入的命令也能放到一个可执行的shell程序里,这意味着用shell语言能简单地重复执行某一任务。

shell的启动

        shell在你成功地登录进入系统后启动,并始终作为你与系统内核的交互手段直至你退出系统。你系统上的每位用户都有一个缺省的shell。每个用户的缺省shell在系统里的passwd文件里被指定,该文件的路径是/etc/passwd。passwd文件里还包含有其他东西:每个人的用户ID号,一个口令加密后的拷贝和用户登录后立即执行的程序,(注:为了加强安全性,现在的系统一般都把加密的口令放在另一个文件--shadow中,而passwd中存放口令的部分以一个x字符代替)虽然没有严格规定这个程序必须是某个Linux shell,但大多数情况下都如此。

几种shell

Bourne shell(sh)

        Bourne shell 的作者是 Steven Bourne。它是 UNIX 最初使用的shell 并且在每种 UNIX 上都可以使用。Bourne shell 在 shell 编程方面相当优秀,但在处理与用户的交互方面作得不如其他几种 shell。(the $ character is the default prompt)

C shell(csh)

        C shell 由 Bill Joy 所写,它更多的考虑了用户界面的友好性。它支持象命令补齐(command-line completion)等一些 Bourne shell 所不支持的特性。普遍认为C shell 的编程接口做的不如 Bourne shell, 但 C shell 被很多 C  程序员使用因为 C shell的语法和 C语言的很相似,这也是C shell名称的由来。(the % character is the default prompt)

The Bourne Again Shell(bash)

        Bourne Again shell ( bash), 正如它的名字所暗示的,是 Bourne shell 的扩展。bash 与 Bourne shell 完全向后兼容,并且在 Bourne shell 的基础上增加和增强了很多特性。bash 也包含了很多 C 和 Korn shell 里的优点。bash 有很灵活和强大的编程接口,同时又有很友好的用户界面。

bash

bash的10种特性

    为什么要用 bash 来代替 sh 呢?Bourne shell 最大的缺点在于它处理用户的输入方面。在 Bourne shell 里键入命令会很麻烦,尤其当你键入很多相似的命令时。而 bash 准备了几种特性使命令的输入变得更容易,特性如下:

1.命令补齐(Command-Line Completion):在打出文件名的头个字母后,按Tab能够补全文件名,当匹配到不止一个以相同字母开头的文件,还需要输入下一个字母,依次循环直至找到

2.通配符

*      匹配任何字符和任何数目的字符
?      匹配任何单字符
[...]  匹配任何包含在括号里的单字符

假如当前目录里包含以下文件:ch1.doc   ch2.doc   ch3.doc  chimp  config    mail/  test/  tools/

//如果需要打印所有扩展名是 .doc 的文件,可以使用以下简化的命令:
lpr *.doc(或lpr *doc或lpr *oc或lpr *c)

//通配符 ? 除了只能匹配单个字符外,其他功能都与通配符 *  相同,如果用通配符 ? 来打印
//前面提到的那个目录里所有扩展名是 .doc 的文件的话,键入下面的命令:
lpr ch?.doc

//通配符[...]能匹配括号中给出的字符或字符范围。同样以前面的目录为例,
//打印那个目录里所有扩展名是 .doc 的文件,你可以键入下列命令之一:
lpr ch[123].doc(或lpr ch[1-3].doc)

3.命令历史记录:

        bash 也支持命令历史记录。这意味着 bash 保留了一定数目的你先前已经在shell 里输入过的命令。这个数目取决于一个叫做HISTSIZE的变量。

        bash 把你先前输入的命令文本保存在一个历史列表中。当你用你的帐号登录后历史列表将根据一个历史文件被初始化。历史文件的文件名被一个叫 HISTFILE 的 bash变量指定。历史文件的缺省名字是 .bash_history。这个文件通常在你的用户目录($HOME)中。(注意该文件的文件名以一个句号开头,这意味着它是隐含的,仅当你带 -a 或 -A参数的 ls 命令列目录时才可见)

        仅将先前的命令存在历史文件里是没有用的,所以 bash 提供了几种方法来调用它们。使用历史记录列表最简单的方法是用上方向键↑或者下方向键↓。(和 DOS 实用程序doskey一样)如果需要的话,显示在命令行上的历史命令可以被编辑。

        另一个使用命令历史文件的方法是用 bash 的内部命令 historyfc(fix 命令)命令来显示和编辑历史命令。

history命令有以下两种方式:
第一种方式:history [n]
1.当 history 命令没有参数时,整个历史命令列表的内容将被显示出来
2.使用 n 参数的作用是仅有最后 n 个历史命令会被列出。例如,history 5 显示最后 5 个命令

第二种方式:history [-r|w|a|n] [filename]
-r 选项告诉 history 命令读命令历史列表文件的内容并且把它们当作当前的命令历史列表
-w 选项将把当前的命令历史记录写入文件中并覆盖文件原来的内容
-a 选项把当前的命令历史记录追加到文件中
-n 选项将读取文件中的内容并加入到当前历史命令列表中
如果 filename 选项没有被指定,history 命令将用变量HISTFILE 的值来代替
fc 命令有以下两种方法来编辑历史命令:
第一种方法:fc [-e editor_name] [-n] [-l] [-r] [first] [last]
这里所有参数都是可选的
-e editor_name 选项用来指定用于编辑命令的文本编辑器。 first 和 last 选项
用于选择列出历史命令的范围,既可以是数字也可以是字符串。
-n 选项禁止列出命令的编号
-r 选项反向列出匹配的命令
-l 选项把匹配的命令行列在屏幕上(而不是在编辑器中)
如果-e editor_name参数没有被指定,则以变量FCEDIT的值来代替,如果该变量不存在的话,
则用变量EDITOR的值来代替,都不存在的话将使用vi编辑器

4.别名:

        bash 的另一个使你的工作变得轻松的方法是命令别名。命令别名通常是其他命令的缩写,用来减少键盘输入。例如,你经常要键入如下的命令,你也许会倾向于为它建立一个别名来减少工作。

        假如为这个长命令建立一个名为goconfig的别名,在bash提示符下键入如下命令:

cd /usr/X11/lib/X11/fvwm/sample-configs
alias goconfig='cd /usr/X11/lib/X11/fvwm/sample-configs'

        现在,除非你退出bash,键入goconfig将和原来的长命令有同样的作用。如果想取消别名,可以使用下面的命令: 

unalias goconfig

        这是一些很多用户认为有用的别名,你可以把它们写入你的.profile文件中提高工作效:

alias ll='ls -l'
alias log='logout'
alias ls='ls -F'

注意: 在定义别名时,等号的两头不能有空格,否则 shell 不能决定你需要做什么。仅在你的命令中包含有空格或特殊字符时才需要引号。

5.输入重定向:

        输入重定向用于改变一个命令的输入源。一些命令需要在命令行里输入足够的信息才能工作。比如 rm,你必须在命令行里告诉 rm 它你要删除的文件。另一些命令则需要更详细的输入,这些命令的输入可能是一个文件。比如命令 wc 统计输入给它的文件里的文件里的字符数,单词数和行数。如果你仅在命令行上键入 wc+<enter> ,wc 将等待你告诉它要统计什么,这时 bash 就好象死了一样,你键入的每样东西都出现在屏幕上,但什么事也不会发生。这是因为 wc 命令正在为自己收集输入。如果你按下Ctrl+D,wc 命令的结果将被写在屏幕上。如果你输入一个文件名做参数,像下面的例子一样,wc 将返回文件所包含的行数单词数字符数

wc test
1 3 7

        另一种把test文件内容传给 wc 命令的方法是重定向 wc 的输入。< 符号在bash里用于把当前命令的输入重定向为指定的文件。所以可以用下面的命令来把 wc 命令的输入重定向为 test 文件:

wc < test
1 3 7

        输入重定向并不经常使用因为大多数命令都以参数的形式在命令行上指定输入文件的文件名。尽管如此,当你使用一个不接受文件名为输入参数的命令,而需要的输入又是在一个已存在的文件里时,你就能用输入重定向解决问题。

6.输出重定向:

        输出重定向的使用与输入重定向很相似,但是输出重定向的符号是 > 。输出重定向比输入重定向更常用。例如,如果某个命令的输出很多,在屏幕上不能完全显示,你能把它重定向到一个文件中,稍后再用文本编辑器来打开这个文件;还有,输出重定向可以用于把一个命令的输出当作另一个命令的输入。(还有一种更简单的方法可以把一个命令的输出当作另一个命令的输入,就是使用管道

7.管道:

        管道可以把一系列命令连接起来。这意味着第一个命令的输出会通过管道传给第二个命令而作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,以此类推。而管道行中最后一个命令的输出才会显示在屏幕上(如果命令行里使用了输出重定向的话,将会放进一个文件里),下面的示例就是一个管道行:

cat sample.text | grep "High" | wc -l

        这个管道将把 cat 命令(列出一个文件的内容)的输出送给grep命令。grep 命令在输入里查找单词 High,grep命令的输出则是所有包含单词 High的行,这个输出又被送给 wc命令。带 -l 选项的 wc命令将统计输入里的行数。假设 sample.txt的内容如下(管道行将返回结果 2):

Things to do today:
Low: Go grocery shopping
High: Return movie
High: Clear level 3 in Alien vs. Predator
Medium: Pick up clothes from dry cleaner

8.提示符:

        bash 有两级用户提示符。第一级是你经常看到的 bash 在等待命令输入时的提示符。缺省的一级提示符是字符$(如果是超级用户,则是#号)。你可以通过改变bash 的PS1变量的值来改变你的缺省提示符,例如:(注意:如果PS1=\t  提示符会变成t)自定制shell提示符

PS1="[\u@\h \w]\$"
[luckystar@luckystar-Lenovo-Rescuer-15ISK ~/work/hxy/RK3308/sdk-1.5]$

[luckystar@luckystar-Lenovo-Rescuer-15ISK sdk-1.5]$PS1="\t"
16:42:03

PS1="/t// "
02:16:30/

        当bash 期待输入更多的信息以完成命令时显示第二级提示符。缺省的第二级提示符是 >。 果你要改变第二级提示符,可以通过设置PS2变量的值来实现

9.作业控制(Job Control):

        作业控制能够控制当前正在运行的进程的行为。特别地,你能把一个正在运行的进程挂起,稍后再恢复它的运行。bash 保持对所有已启动的进程的跟踪,你能在一个正在运行的进程的生命期内的任何时候把它挂起或是使它恢复运行。

        按下 Ctrl+Z 使一个运行的进程挂起(Ctrl+C是强制终止程序的执行)。bg 命令使一个被挂起的进程在后台恢复运行,反之 fg 命令使进程在前台恢复运行。这几个命令在当用户想在后台运行而意外的把它放到了前台时,经常被用到。当一个命令在前台被运行时,它会禁止用户与 shell 的交互,直到该命令结束。这通常不会造成麻烦,因为大多数命令很快就执行完了。如果你要运行的命令要花费很长的时间的话,我们通常会把它放到后台,以使我们能在前台继续输入其他命令。例如,你输入这个命令:

command find / -name "test" > find.out

        它将寻找整个文件系统中的名为test 的文件并把结果保存在一个叫 find.out 的文件里。如果在前台运行的话,根据文件系统的大小,你的shell将有数秒甚至数分钟不能使用,你不想这样的话可以再输入以下面的内容:

control+z
bg

        find 命令首先被挂起,再在后台继续被执行,并且你能马上回到bash下

10.用户化配置bash

        本文已经描述了许多用户化配置bash的方法(例如上面我们刚刚提到的命令PS1="/t// " )。但知道现在为止,我们所做的改动都仅在当前运行的bash下才有效。一旦退出系统,所有的改动也随之消失了。为了保存这些用户化配置,你必须把它们保存到一个bash的初始化文件里。

        你能把任何想每次进入bash都执行的命令放到初始化文件里。这个文件里最常见到的命令通常是alias和变量的初始化。bash的初始化文件叫做 profile。每个使用bash的用户都有一个 .profile文件在他的用户目录里(也可能是.bash_profile)。bash在每次启动时都读取这个文件,并执行所有包含的命令。

        下面的代码是缺省(默认状态)的.profile文件的内容。这个文件的位置在 /etc目录。如果你想设置自己的bash 的话把它拷到你的用户目录里(如果还没有的话)并命名为.profile。 注意: 有些setup程序会在建立用户时自动放一个.profile文件的拷贝在你的用户目录里。但是并不是所有的都这么做,所以最好先检查一下你的用户目录。记住所有以句点开头的文件都是隐含的,只有用ls -als -A命令才能列出,以下是用hxy电脑做试验(ls etc就能看到了),然后cat profile得到的:

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

# The default umask is now handled by pam_umask.
# See pam_umask(8) and /etc/login.defs.

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

bash 命令概要

这是几个最有用的bash内部命令:

alias:  设置bash别名
bg:     使一个被挂起的进程在后台继续执行
cd:     改变当前工作目录
exit:   终止shell
export: 使变量的值对当前shell的所有子进程都可见 
fc:     用来编辑历史命令列表里的命令
fg:     使一个被挂起的进程在前台继续执行
help:   显示bash内部命令的帮助信息
kill:   终止某个进程
pwd:    显示当前工作目录
unalias: 删除已定义的别名

想了解更详细的情况,请参考bash的手册--在提示符下键入 man bash

bash 变量

  • EDITORFCEDIT: bsah fc 命令的缺省编辑器。
  • HISTFILE: 用于贮存历史命令的文件。
  • HISTSIZE: 历史命令列表的大小。
  • HOME: 当前用户的用户目录。
  • OLDPWD: 前一个工作目录。
  • PATH: bash寻找可执行文件的搜索路径。
  • PS1: 命令行的一级提示符。
  • PS2: 命令行的二级提示符。
  • PWD: 当前工作目录。
  • SECONDS: 当前shell开始后所流逝的秒

shell的执行

向脚本传递参数

        可以使用系统定义的位置变量,位置变量是一类比较特殊的变量,引用脚本参数时,可以使用$1到$9这9个变量,示例1分别使用$1、$2 、$3 、$4捕获传递给脚本文件的第1 2 3 4个参数,并将其输出:

cat example1.sh

#!/bin/bash
#Demonstrate the use of positive variables.
echo "The first parameter:"$1
echo "The second parameter:"$2
echo "The third parameter:"$3
echo "The fourth parameter:"$4

#为脚本文件添加可执行权限
chmod u+x example1.sh

./example1.sh One Two  Three  Four
The first parameter: One
The second parameter: Two
The three parameter: Three
The fourth parameter: Four

示例2:

#example2.sh
echo '$1' "=" $1    '$2' "=" $2    '$3' "=" $3
echo '$4' "=" $4    '$5' "=" $5    '$6' "=" $6
echo '$7' "=" $7    '$8' "=" $8    '$9' "=" $9

./example2.sh a b c d e f g h i

#结果
$1 = a    $2 = b    $3 = c
$4 = d    $5 = e    $6 = f
$7 = g    $8 = h    $9 = i

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于C++&OPENCV 的全景图像拼接 C++是一种广泛使用的编程语言,它是由Bjarne Stroustrup于1979年在新泽西州美利山贝尔实验室开始设计开发的。C++是C语言的扩展,旨在提供更强大的编程能力,包括面向对象编程和泛型编程的支持。C++支持数据封装、继承和多态等面向对象编程的特性和泛型编程的模板,以及丰富的标准库,提供了大量的数据结构和算法,极大地提高了开发效率。12 C++是一种静态类型的、编译式的、通用的、大小写敏感的编程语言,它综合了高级语言和低级语言的特点。C++的语法与C语言非常相似,但增加了许多面向对象编程的特性,如类、对象、封装、继承和多态等。这使得C++既保持了C语言的低级特性,如直接访问硬件的能力,又提供了高级语言的特性,如数据封装和代码重用。13 C++的应用领域非常广泛,包括但不限于教育、系统开发、游戏开发、嵌入式系统、工业和商业应用、科研和高性能计算等领域。在教育领域,C++因其结构化和面向对象的特性,常被选为计算机科学和工程专业的入门编程语言。在系统开发领域,C++因其高效性和灵活性,经常被作为开发语言。游戏开发领域中,C++由于其高效性和广泛应用,在开发高性能游戏和游戏引擎中扮演着重要角色。在嵌入式系统领域,C++的高效和灵活性使其成为理想选择。此外,C++还广泛应用于桌面应用、Web浏览器、操作系统、编译器、媒体应用程序、数据库引擎、医疗工程和机器人等领域。16 学习C++的关键是理解其核心概念和编程风格,而不是过于深入技术细节。C++支持多种编程风格,每种风格都能有效地保证运行时间效率和空间效率。因此,无论是初学者还是经验丰富的程序员,都可以通过C++来设计和实现新系统或维护旧系统。3

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值