1

I'm currently a bit confused regarding arguments and parameters for a question.

I currently have to accept the log filename as a parameter (For example, /var/log/secure-<yyyymmdd>) but default to /var/log/secure if no arguments are given.

How do I accept the log filename as a parameter? I think it might be the phrasing of the question, but I don't quite get what it means.

This is a snippet of the current code I have done so far before this question:

#!/bin/bash
grep " su: " /var/log/secure | while read -r abc; do   
echo "$abc"
done

For the 2nd part, I have to create a function that exits with code 2 (I'm working on that currently) and afterwards, call that function if a filename is passed but the file doesn't exist. Would I do something like this? It feels wrong but not sure where.

IF [ -d /var/log/secure ]
then

else
runfunction

1 Answer 1

5

To set a variable to the first command line argument, you would do

pathname=$1

To set it to a default value in case the argument is not available or if it's empty, use

pathname=${1:-/var/log/secure}

The general form is ${parameter:-word}. This is a standard POSIX parameter expansion, and it's also documented in the manual of your shell.

The -d test tests whether the given string corresponds to an existing directory path (or is a symbolic link to one that exists). The -f test is for regular files in the same way, and -e covers anything (will be true if the name exists, regardless of what it is a name of).

To negate the sense of a test, you would use !, so you get

if [ ! -f "$pathname" ]; then
    myfunction
fi

or, using short-circuit syntax,

[ ! -f "$pathname" ] && myfunction

This would call myfunction if the string in the pathname variable did not designate an existing regular file (or a link to one).


A complete script that takes a command line argument (a path) with a default value and exits with exit status 2 if the given path does not correspond to an existing regular file.

#!/bin/bash

pathname=${1:-/var/log/secure}

if [ ! -f "$pathname" ]; then
    printf 'There is no file called "%s"\n' "$pathname"
    exit 2
fi

printf 'The file "%s" exists\n' "$pathname"
4
  • Thanks, so following the if statement, would this work pathname=${1:-/var/log/secure} exitcode() { exit 2 } if [ ! -f "$pathname" ]; then exitcode fi (Sorry, not sure how to format a comment but this is how it looks i.imgur.com/5cHQpJD.png ) Commented Sep 13, 2018 at 20:17
  • @Zanders2001 Yes, but I so real point in using the function when you can just conditionally call exit 2 directly. Commented Sep 13, 2018 at 20:19
  • I think its just to get a general idea of it, this is our first script that we've worked on in class (And my first bash script). Also regarding the first question, I'm still a bit confused about accepting log filename as a parameter. This is what I have so far i.imgur.com/WTx6nPR.png Commented Sep 13, 2018 at 20:32
  • @Zanders2001 See updated answer. Commented Sep 13, 2018 at 21:01

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.