天道酬勤,学无止境

用于在文件层次结构中查找特定文件的 Bash 脚本(Bash script to find specific files in a hierarchy of files)

问题

我有一个文件夹,其中有很多文件夹,在每个文件夹中我都有很多很多文件。 我不知道每个文件可能位于哪个文件夹中。我会定期收到我需要复制到预定义目的地的文件列表。

该脚本将在 Unix 机器上运行。

所以,我的小脚本应该:

  • 读取接收列表
  • 查找列表中的所有文件
  • 通过 SCP 将每个文件复制到预定义的目的地

第 1 步和第 3 步,我想我会自己管理,但是我将如何进行第 2 步?

我正在考虑使用“查找”来定位每个文件,找到后,将位置写入字符串数组中。 找到所有文件后,我遍历字符串数组,为每个文件位置运行“SCP”命令。

我认为这应该可行,但我以前从未编写过 bash 脚本,所以有人可以帮助我入门吗? 我只需要一个基本的“查找”命令,它会查找文件名并在找到文件时返回文件位置。

回答1
find $dir -name $name -exec scp {} $destination \;
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • bash 脚本中查找函数的结果问题(Issue with result of a find function in a bash script)
    问题 我在 bash 中的脚本有问题。 我的 for 函数正在使用 find 函数的结果。 长话短说:在 SSH 中,find 函数返回 2 个结果,而在 bash 脚本中则返回一个结果。 我尝试了以下两个代码。 for f in $(find $path -name *.properties) do echo $f done 或者 list=$(find $path -name *.properties) for f in $list; do echo $f done 在指定的路径中有几个文件夹和文件,其中两个文件具有我正在寻找的扩展名。 如果我在 SSH 中运行这些命令之一,我会找到两个文件,但是如果我从 bash 脚本运行命令,结果将包含一个文件。 for 函数工作正常,问题是 find 函数。 我在脚本 bash 中运行以下代码,但仍然有一个结果。 list=$(find $path -name *.properties) echo $list 我在 SSH 中运行以下代码,发现 2 个文件: [root@was85 ~]# for f in $(find $path/temp/ -name *.properties); do echo $f > done 谁能帮我? 谢谢! 回答1 如果使用BASH更好地使用这个while循环,使用process
  • Bash脚本删除除特定文件和目录之外的所有文件和目录(Bash script to remove all files and directories except specific ones)
    问题 我正在尝试编写一个非常简单的Bash shell脚本,该脚本将在特定目录中进行cd安装,它将删除所有文件和目录(除了一些选定的文件和目录之外),然后将cd返回到原始目录。 我的代码是: #!/bin/bash cd /path/to/desired/directory shopt -s extglob rm !\(filename1\|filename2\|filename3\) -rf cd - 我尝试了多种写法,用单引号或双引号或反斜杠来写符号'('和'|',但没有任何效果。请注意, shopt -s extglob和rm !(filename1|filename2) -rf在a外部可以正常工作脚本。 可能我犯了一个我看不见的标准和基本的bash脚本错误,但是经验将要来临... 有什么建议么!? 提前致谢。 回答1 我马上就能看到两个问题: rm的-rf参数必须位于文件名之前 extglob说明符! , ( , |和)不应该用反斜杠转义 尝试以下方法: rm -rf !(filename1|filename2|filename3) 如果仍然无法正常工作,请删除-f参数,您将收到有关发生问题的错误消息,而不是静默地抑制它们。 要打印出每个已删除文件的名称,您还可以添加-v选项。 回答2 如果您使用的是最新版本的find ,请使用: find . -not -regex
  • 用于查找所有 .h 文件并放入具有相同结构的指定文件夹的脚本?(Script to find all .h file and put in specified folder with same structure?)
    问题 我需要一个像这样的 bash 脚本 标题 ~/headers-folder ~/output-folder 所以它递归地找到 ~/headers-folder 中的所有 .h 文件,并将它们全部放在 ~/output-folder 中,并保持文件夹层次结构? 谢谢! 回答1 find /path/to/find -name "*.h" -type f | xargs -I {} cp --parents {} /path/to/destination 看一下这个。 回答2 rsync 也非常适合: rsync --include '*.h' --filter 'hide,! */' -avm headers-folder/ output-folder/ 这将复制所有*.h文件,并仅创建必要的目录。 例子: mkdir -p headers-folder/{subdir,empty} touch headers-folder/foo.h touch headers-folder/subdir/foo.h tree headers-folder # headers-folder/ # |-- empty # |-- foo.h # `-- subdir # `-- foo.h rsync --include '*.h' --filter 'hide,! */' -avm
  • 如何在文件夹层次结构中找到所有不同的文件扩展名?(How can I find all of the distinct file extensions in a folder hierarchy?)
    问题 在Linux机器上,我想遍历文件夹层次结构并获取其中所有不同文件扩展名的列表。 从外壳实现这一目标的最佳方法是什么? 回答1 试试这个(不确定这是否是最好的方法,但是可以用): find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u 它的工作方式如下: 查找当前文件夹中的所有文件打印文件扩展名(如果有) 制作唯一的排序列表 回答2 无需对管道进行sort ,awk可以完成所有操作: find . -type f | awk -F. '!a[$NF]++{print $NF}' 回答3 递归版本: find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u 如果要总计(查看扩展名的次数): find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort | uniq -c | sort -rn 非递归(单个文件夹): for f in *.*; do printf "%s\n" "${f##*.}"; done | sort -u 我是基于此论坛帖子而建立的,功劳应该归功于此。 回答4 电源外壳: dir -recurse | select-object extension
  • 如何在给定目录中查找重复的文件名(递归)? 巴什(How to find duplicate filenames (recursively) in a given directory? BASH)
    问题 我需要在给定的目录树中找到每个重复的文件名。 我不知道,目录树用户将提供什么作为脚本参数,所以我不知道目录层次结构。 我试过这个: #!/bin/sh find -type f | while IFS= read vo do echo `basename "$vo"` done 但这并不是我真正想要的。 它只找到一个重复项然后结束,即使有更多重复的文件名,它也不会打印整个路径(仅打印文件名)和重复计数。 我想做一些类似于这个命令的事情: find DIRNAME | tr '[A-Z]' '[a-z]' | sort | uniq -c | grep -v " 1 " 但它确实对我有用,不知道为什么。 即使我有重复,它也不会打印任何内容。 我使用Xubuntu 12.04。 回答1 这是另一个没有 awk 的解决方案(基于@jim-mcnamara 的建议): 解决方案1 #!/bin/sh dirname=/path/to/directory find $dirname -type f | sed 's_.*/__' | sort| uniq -d| while read fileName do find $dirname -type f | grep "$fileName" done 但是,您必须进行两次相同的搜索。 如果您必须搜索大量数据,这可能会变得非常缓慢。 将
  • 使用bash脚本查找特定行并在该行中复制特定内容(To Find a Particular line and copying a specific content within the line using bash scripting)
    问题 我有一个文件system.mss,文件的一些内容是: BEGIN lmb_bram_if_cntlr PARAMETER INSTANCE = dlmb_cntlr_0 PARAMETER HW_VER = 3.00.b PARAMETER C_BASEADDR = 0x00000000 PARAMETER C_HIGHADDR = 0x0003ffff BUS_INTERFACE SLMB = dlmb_0 BUS_INTERFACE BRAM_PORT = calmb_0_BRAM_PORTA END BEGIN lmb_bram_if_cntlr PARAMETER INSTANCE = ilmb_cntlr_0 PARAMETER HW_VER = 3.00.b PARAMETER C_BASEADDR = 0x00000000 PARAMETER C_HIGHADDR = 0x0003ffff BUS_INTERFACE SLMB = ilmb_0 BUS_INTERFACE BRAM_PORT = ilmb_cntlr_0_BRAM_PORT END BEGIN lmb_bram_if_cntlr PARAMETER INSTANCE = dlmb_cntlr_1 PARAMETER HW_VER = 3.00.b PARAMETER C_BASEADDR =
  • Linux 必备指令
    原文地址:https://github.com/jlevy/the-art-of-command-line/blob/master/README-zh.md#日常使用前言涵盖范围:这篇文章不仅能帮助刚接触命令行的新手,而且对具有经验的人也大有裨益。本文致力于做到覆盖面广(涉及所有重要的内容),具体(给出具体的最常用的例子),以及简洁(避免冗余的内容,或是可以在其他地方轻松查到的细枝末节)。在特定应用场景下,本文的内容属于基本功或者能帮助您节约大量的时间。本文主要为 Linux 所写,但在仅限 OS X 系统章节和仅限 Windows 系统章节中也包含有对应操作系统的内容。除去这两个章节外,其它的内容大部分均可在其他类 Unix 系统或 OS X,甚至 Cygwin 中得到应用。本文主要关注于交互式 Bash,但也有很多技巧可以应用于其他 shell 和 Bash 脚本当中。除去“标准的”Unix 命令,本文还包括了一些依赖于特定软件包的命令(前提是它们具有足够的价值)。注意事项:为了能在一页内展示尽量多的东西,一些具体的信息可以在引用的页面中找到。我们相信机智的你知道如何使用 Google 或者其他搜索引擎来查阅到更多的详细信息。文中部分命令需要您使用 apt-get,yum,dnf,pacman, pip 或 brew(以及其它合适的包管理器)来安装依赖的程序。遇到问题的话
  • 人们为什么在Python脚本的第一行写#!/ usr / bin / env python?(Why do people write #!/usr/bin/env python on the first line of a Python script?)
    问题 在我看来,这些文件在没有该行的情况下运行相同。 回答1 如果安装了多个版本的Python,则/usr/bin/env将确保使用的解释器是环境的$PATH的第一个解释器。 另一种方法是对#!/usr/bin/python类的东西进行硬编码; 可以,但是不太灵活。 在Unix中,要解释的可执行文件可以通过使用#!来指示要使用的解释器#! 在第一行的开头,然后是解释器(及其可能需要的任何标志)。 当然,如果您在谈论其他平台,则此规则不适用(但“ shebang行”没有害处,并且如果您将该脚本复制到具有Unix基础的平台(例如Linux,Mac),将有帮助, 等等)。 回答2 那就是shebang线。 如Wikipedia条目所述: 在计算中,“ shebang”(也称为“ hashbang”,“ hashhpling”,“ bang bang”或“ crunchbang”)是指字符“#!”。 当它们是解释器指令中的前两个字符时(作为文本文件的第一行)。 在类似Unix的操作系统中,程序加载器将这两个字符的存在指示为文件是脚本,并尝试使用文件第一行其余部分指定的解释器执行该脚本。 另请参见Unix FAQ条目。 即使在Windows上,shebang行不能确定要运行的解释程序,也可以通过在shebang行上指定选项来将选项传递给解释程序。
  • 删除所有文件但将所有目录保留在 bash 脚本中?(Delete all files but keep all directories in a bash script?)
    问题 我正在尝试做一些可能非常简单的事情,我有一个目录结构,例如: dir/ subdir1/ subdir2/ file1 file2 subsubdir1/ file3 我想在 bash 脚本中运行一个命令,该命令将从 dir 向下递归删除所有文件,但保留所有目录。 IE: dir/ subdir1/ subdir2/ subsubdir1 什么是合适的命令? 回答1 find dir -type f -print0 | xargs -0 rm find递归地列出给定目录中与特定表达式匹配的所有文件。 -type f匹配常规文件。 -print0用于使用\0作为分隔符打印名称(因为任何其他字符,包括\n ,都可能在路径名中)。 xargs用于从标准输入收集文件名并将它们作为参数。 -0是为了确保xargs能够理解\0分隔符。 如果参数列表变得太大, xargs足够明智地多次调用rm 。 所以这比试图打电话要好得多。 像rm $((find ...) 。它也比rm为每个文件调用rm快得多,比如find ... -exec rm \{\} 。 回答2 使用 GNU find您可以使用-delete操作: find dir -type f -delete 使用标准find您可以使用-exec rm : find dir -type f -exec rm {} + 回答3 find
  • 如何确保我的bash脚本尚未运行?(How do I make sure my bash script isn't already running?)
    问题 我有一个bash脚本,我想每隔5分钟从cron运行一次...但是有可能该脚本的上一次运行尚未完成...在这种情况下,我希望新的运行退出。 我不想只依赖/ tmp中的锁定文件。我想确保在我兑现锁定文件(或其他任何文件)之前,该过程确实在运行... 到目前为止,这是我从互联网上窃取的东西……如何使它变得更聪明? 还是有完全不同的更好的方法? if [ -f /tmp/mylockFile ] ; then echo 'Script is still running' else echo 1 > /tmp/mylockFile /* Do some stuff */ rm -f /tmp/mylockFile fi 回答1 # Use a lockfile containing the pid of the running process # If script crashes and leaves lockfile around, it will have a different pid so # will not prevent script running again. # lf=/tmp/pidLockFile # create empty lock file if none exists cat /dev/null >> $lf read lastPID < $lf #
  • 符号链接复制目录层次结构(symlink-copying a directory hierarchy)
    问题 在Linux上“复制”目录层次结构以创建目录的新层次结构,同时所有“文件”只是指向源层次结构上实际文件的符号链接,最简单的方法是什么? cp -s不能递归工作。 回答1 我在Google上搜索了一下,找到了一个名为lns的命令,可从此处获得。 回答2 我只是在linux机器上进行了快速测试,而cp -sR /orig /dest正是您所描述的:创建带有符号链接的目录层次结构,将非目录还原为原始目录。 回答3 cp -as /root/absolute/path/name dest_dir 会做你想要的。 请注意,源名称必须是绝对路径,不能是相对路径。 否则,您将收到此错误:“ xyz文件:只能在当前目录中建立相对的符号链接。” 另外,请注意要复制的内容:如果dest_dir已经存在,则必须执行以下操作: cp -as /root/absolute/path/name/* dest_dir/ cp -as /root/absolute/path/name/.* dest_dir/ 回答4 从原始目录和新目录开始,我认为这对find(1)命令将满足您的需求: find original -type d -exec mkdir new/{} \; find original -type f -exec ln -s {} new/{} \
  • 在数十个JAR文件中的某个地方找到课程?(Find a class somewhere inside dozens of JAR files?)
    问题 您如何在许多jar文件中找到特定的类名? (查找实际的类名,而不是引用它的类。) 回答1 Eclipse可以做到这一点,只需创建一个(临时)项目并将您的库放在项目的类路径中即可。 然后,您可以轻松找到类。 我想到的另一个工具是Java Decompiler。 它可以一次打开很多罐子,也有助于查找类。 回答2 的Unix 在Linux,其他Unix变体,Windows上的Git Bash或Cygwin上,使用jar (或unzip -v ), grep和find命令。 以下列出了与给定名称匹配的所有类文件: for i in *.jar; do jar -tvf "$i" | grep -Hsi ClassName && echo "$i"; done 如果知道要搜索的Java归档的整个列表,则可以使用(符号)链接将它们全部放在同一目录中。 或使用find (区分大小写)查找包含给定类名的JAR文件: find path/to/libs -name '*.jar' -exec grep -Hls ClassName {} \; 例如,要查找包含IdentityHashingStrategy的档案的名称: $ find . -name '*.jar' -exec grep -Hsli IdentityHashingStrategy {} \; ./trove-3.0.3.jar
  • shell基础使用
    2、shell 2.1、shell基础正则表达式 ​ 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。并规定一些特殊语法表示字符类、数量限定符和位置关系,然后用这些特殊语法和普通字符一起表示一个模式,这就是正则表达式( Regular Expression ) 。 2.1.1、普通元字符 字符 描述 \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。串行“\\”匹配“\”而“\(”则匹配“(”。 ^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。 $ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。 * 匹配前面的子表达式零次或多次。例如,zo能匹配“z”以及“zoo”。等价于{0,}。 + 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。 ? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等价于{0,1}。 {n}
  • 使用文件名中的特定子字符串连接文本文件的 Bash 脚本(Bash script to concatenate text files with specific substrings in filenames)
    问题 在某个目录中,我有许多包含一堆文本文件的目录。 我正在尝试编写一个脚本,该脚本仅将每个目录中文件名中包含字符串 'R1' 的文件连接到该特定目录中的一个文件中,并将其连接到另一个 .R2 中的文件中。 这是我写的,但它不起作用。 #!/bin/bash for f in */*.fastq; do if grep 'R1' $f ; then cat "$f" >> R1.fastq fi if grep 'R2' $f ; then cat "$f" >> R2.fastq fi done 我没有收到任何错误,文件是按预期创建的,但它们是空文件。 谁能告诉我我做错了什么? 感谢大家快速而详细的回复! 我想我的问题不是很清楚,但我需要脚本只连接每个特定目录中的文件,以便每个目录都有一个新文件(R1 和 R2)。 我试着做 cat /*R1*.fastq >*/R1.fastq 但它给了我一个模棱两可的重定向错误。 我还尝试了 Charles Duffy 的 for 循环,但循环遍历目录并执行嵌套循环以运行目录中的每个文件,如下所示 for f in */; do for d in "$f"/*.fastq;do case "$d" in *R1*) cat "$d" >&3 *R2*) cat "$d" >&4 esac done 3>R1.fastq 4>R2.fastq
  • 用于 cd 到目录中最新目录的 Bash 脚本(Bash script to cd into newest directory within a directory)
    问题 我正在尝试向我正在编写的数据收集 bash 脚本添加一个函数。 目的是指向特定目录,然后 cd 进入父目录中的 NEWEST 目录。 伪代码: cd top_dir for each dir in top_dir: age = dir.age if age < least_age: least_age = age newest_dir = dir cd newest_dir 我试过使用cd "$( find "$1"/* -prune -type d 2>/dev/null | xargs stat -c "%Y %n" 2>/dev/null | sort -nr | head -n 1 | cut -d " " -f 2-)"来自这篇文章,但 cd 将我转到我计算机上的最新目录。 目的是使用如下目录结构: parent_dir: child_1 | Last Edited 1 Hr Ago child_2 | Last Edited 1 Yr Ago child_3 | Last Edited 2 Yr Ago child_4 | Last Edited 1 Min Ago child_5 | Last Edited 1 Week Ago 该命令将cd我进child_4 回答1 您尝试使用的代码旨在成为函数体; 调用该函数正确设置$1 。 就其本身而言, $1可能未设置
  • 使用Git保留文件权限(Retaining file permissions with Git)
    问题 我想通过在/var/www directory创建一个git repo来对Web服务器进行版本控制,如Web服务器的版本控制中所述。 我的希望是,然后我能够将Web内容从开发服务器推送到github,再将其拉到生产服务器,并在一天的余下时间里度过。 显然,我的计划中的一个缺点是Git不尊重文件权限(我还没有尝试过,仅现在就阅读它。)我想这很有意义,因为不同的盒子可能具有不同的用户/组设置。 但是,如果我想强制传播权限,知道我的服务器配置相同,我是否有其他选择? 还是有一种更简单的方法来处理我要尝试的操作? 回答1 SO问题“ git-如何恢复git认为文件应该是的文件许可权”中提到的git-cache-meta? (以及git FAQ)是更简单的方法。 想法是在.git_cache_meta文件中存储文件和目录的权限。 它是一个单独的文件,未在Git存储库中直接进行版本控制。 这就是为什么它的用法是: $ git bundle create mybundle.bdl master; git-cache-meta --store $ scp mybundle.bdl .git_cache_meta machine2: #then on machine2: $ git init; git pull mybundle.bdl master; git-cache-meta -
  • 如何在POSIX sh中获取脚本目录?(How to get script directory in POSIX sh?)
    问题 我的bash脚本中有以下代码。 现在我想在POSIX sh中使用它。 如何转换? DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )" 回答1 $BASH_SOURCE的POSIX-shell( sh )对应$BASH_SOURCE是$0 。 请参阅底部的背景信息 注意:关键区别在于,如果源代码是脚本的源代码(使用.加载到当前shell中) ,则下面的代码片段将无法正常工作。 下面进一步解释 请注意,在以下代码段中,我已将DIR更改为dir ,因为最好不要使用全大写的变量名,以避免与环境变量和特殊的shell变量发生冲突。 在CDPATH=前缀需要的地方> /dev/null在原来的命令: $CDPATH设置为空字符串,以保证cd从来没有任何回音。 在最简单的情况下,可以这样做(相当于OP的command ): dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) 如果在目录和/或其组件为符号链接的情况下,如果还要将最终目录路径解析为其最终目标,请在pwd命令中添加-P : dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P) 警告:这是不一样的发现脚本自身起源的真正目录: 假设您的脚本foo在
  • Unix shell 文件复制扁平化文件夹结构(Unix shell file copy flattening folder structure)
    问题 在 UNIX bash shell(特别是 Mac OS X Leopard)上,将每个具有特定扩展名的文件从文件夹层次结构(包括子目录)复制到同一目标文件夹(没有子文件夹)的最简单方法是什么? 显然,在源层次结构中存在重复的问题。 如果它们被覆盖,我不介意。 示例:我需要复制以下层次结构中的每个 .txt 文件 /foo/a.txt /foo/x.jpg /foo/bar/a.txt /foo/bar/c.jpg /foo/bar/b.txt 到名为“dest”的文件夹并获取: /dest/a.txt /dest/b.txt 回答1 在 bash 中: find /foo -iname '*.txt' -exec cp \{\} /dest/ \; find将查找/foo路径下与通配符*.txt匹配的所有文件,不区分大小写(这就是-iname意思)。 对于每个文件, find将执行cp {} /dest/ ,用找到的文件代替{} 。 回答2 Magnus 的解决方案唯一的问题是它为每个文件分叉出一个新的“cp”进程,这不是非常有效,尤其是在有大量文件的情况下。 在 Linux(或其他带有 GNU coreutils 的系统)上,您可以执行以下操作: find . -name "*.xml" -print0 | xargs -0 echo cp -t a (-0
  • 如何从脚本本身中获取Bash脚本的源目录?(How can I get the source directory of a Bash script from within the script itself?)
    问题 我如何获取该脚本内Bash脚本所在目录的路径? 我想将Bash脚本用作另一个应用程序的启动器。 我想将工作目录更改为Bash脚本所在的目录,以便可以对该目录中的文件进行操作,如下所示: $ ./application 回答1 #!/bin/bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" 是有用的单行代码,无论从何处调用脚本,它都将为您提供脚本的完整目录名称。 只要用于查找脚本的路径的最后一个组成部分不是符号链接(目录链接都可以),它将起作用。 如果您还想解析到脚本本身的任何链接,则需要一个多行解决方案: #!/bin/bash SOURCE="${BASH_SOURCE[0]}" while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )" SOURCE="$(readlink "$SOURCE")" [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative
  • Shell进阶 文件查找 压缩打包
    Shell脚本进阶 文件查找与打包压缩 1、变量 1.1 变量类型 变量类型: 内置变量,如:PS1,PATH,UID,HOSTNAME,$$,BASHPID,PPID,$?,HISTSIZE 用户自定义变量 1.2 Shell变量命名法则 不能使用程序中保留字:如 if,for 只能使用数字、字母及下划线,且不能以数字开头,不支持短横线 "-", 和主机名相反 见名知义,用英文单词命名,并体现出时间作用,不要用简写 统一命名规则: 驼峰命名法 studentname,大驼峰 StudentName 小驼峰 studentName 变量名大写:STUDENT_NAME 局部变量小写 函数名小写 变量赋值: name='value' value可以是以下多种形式 直接字串:name='root' 变量引用:name="$USER" 命令引用:Name=`COMMAND` 或 name=$(COMMAND) 1.3 位置变量 位置变量: bash shell中内置的变量,在脚本中通过命令行传递给脚本的参数 $1,$2,... 对应第1个,第2个等参数 $0 命令本身,包括路径 $* 传递脚本的所有参数,全部参数合为一个字符串 $@ 传递脚本的所有参数,每个参数为独立字符串 $# 传递给脚本的参数的个数 set -- 清空所有位置变量 范例: [root@CentOS8 data]